- Use if, instead of switch to handle flags in XFORMOBJ_bXformFixPoints
- Define XFORMOBJ to EXFORMOBJ, a stack object that links to the matrix
- There is no spoon.

svn path=/trunk/; revision=50307
This commit is contained in:
Timo Kreuzer 2011-01-06 22:00:26 +00:00
parent 38bbc45b31
commit ca4ebe1b55
7 changed files with 225 additions and 106 deletions

View file

@ -1,13 +1,80 @@
#pragma once
#include <include/dc.h>
#include <include/xformobj.h>
#define IntDPtoLP(dc, pp, c) XFORMOBJ_bApplyXform((XFORMOBJ*)&(dc)->dclevel.mxDeviceToWorld, XF_LTOL, c, pp, pp);
#define IntLPtoDP(dc, pp, c) XFORMOBJ_bApplyXform((XFORMOBJ*)&(dc)->dclevel.mxWorldToDevice, XF_LTOL, c, pp, pp);
#define CoordDPtoLP(dc, pp) XFORMOBJ_bApplyXform((XFORMOBJ*)&(dc)->dclevel.mxDeviceToWorld, XF_LTOL, 1, pp, pp);
#define CoordLPtoDP(dc, pp) XFORMOBJ_bApplyXform((XFORMOBJ*)&(dc)->dclevel.mxWorldToDevice, XF_LTOL, 1, pp, pp);
#define XForm2MatrixS(m, x) XFORMOBJ_iSetXform((XFORMOBJ*)m, (XFORML*)x)
#define MatrixS2XForm(x, m) XFORMOBJ_iGetXform((XFORMOBJ*)m, (XFORML*)x)
#define IntLPtoDP(pdc, ppt, count) DC_vXformWorldToDevice(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt));
#define CoordLPtoDP(pdc, ppt) DC_vXformWorldToDevice(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
#define IntDPtoLP(pdc, ppt, count) DC_vXformDeviceToWorld(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt));
#define CoordDPtoLP(pdc, ppt) DC_vXformDeviceToWorld(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
#define XForm2MatrixS(m, x) XFormToMatrix(m, (XFORML*)x)
#define MatrixS2XForm(x, m) MatrixToXForm((XFORML*)x, m)
FORCEINLINE
void
XFormToMatrix(
MATRIX *pmx,
const XFORML *pxform)
{
XFORMOBJ xo;
XFORMOBJ_vInit(&xo, pmx);
XFORMOBJ_iSetXform(&xo, pxform);
}
FORCEINLINE
void
MatrixToXForm(
XFORML *pxform,
const MATRIX *pmx)
{
XFORMOBJ xo;
XFORMOBJ_vInit(&xo, (MATRIX*)pmx);
XFORMOBJ_iGetXform(&xo, pxform);
}
FORCEINLINE
void
InvertXform(
XFORML *pxformDest,
const XFORML *pxformSource)
{
XFORMOBJ xo;
MATRIX mx;
XFORMOBJ_vInit(&xo, &mx);
XFORMOBJ_iSetXform(&xo, pxformSource);
XFORMOBJ_iInverse(&xo, &xo);
XFORMOBJ_iGetXform(&xo, pxformDest);
}
FORCEINLINE
void
DC_vXformDeviceToWorld(
IN PDC pdc,
IN ULONG cNumPoints,
IN PPOINTL pptlDest,
IN PPOINTL pptlSource)
{
XFORMOBJ xo;
XFORMOBJ_vInit(&xo, &pdc->dclevel.mxDeviceToWorld);
XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
}
FORCEINLINE
void
DC_vXformWorldToDevice(
IN PDC pdc,
IN ULONG cNumPoints,
IN PPOINTL pptlDest,
IN PPOINTL pptlSource)
{
XFORMOBJ xo;
XFORMOBJ_vInit(&xo, &pdc->dclevel.mxWorldToDevice);
XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
}
int APIENTRY IntGdiSetMapMode(PDC, int);
@ -20,4 +87,4 @@ IntGdiModifyWorldTransform(PDC pDc,
VOID FASTCALL IntMirrorWindowOrg(PDC);
void FASTCALL IntFixIsotropicMapping(PDC);
LONG FASTCALL IntCalcFillOrigin(PDC);
PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);
PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);

View file

@ -4,6 +4,7 @@
#include <reactos/win32k/ntgdihdl.h>
#include "dc.h"
#include "math.h"
#include "xformobj.h"
#include <ft2build.h>
#include FT_FREETYPE_H

View file

@ -1,28 +1,76 @@
#pragma once
typedef struct _EXFORMOBJ
{
MATRIX *pmx;
} EXFORMOBJ;
#define XFORMOBJ EXFORMOBJ
#define XFORMOBJ_iGetXform EXFORMOBJ_iGetXform
#define XFORMOBJ_iGetFloatObjXform EXFORMOBJ_iGetFloatObjXform
#define XFORMOBJ_bApplyXform EXFORMOBJ_bApplyXform
#define XFORMOBJ_vInit EXFORMOBJ_vInit
#define XFORMOBJ_pmx EXFORMOBJ_pmx
#define XFORMOBJ_iSetXform EXFORMOBJ_iSetXform
#define XFORMOBJ_iCombine EXFORMOBJ_iCombine
#define XFORMOBJ_iCombineXform EXFORMOBJ_iCombineXform
#define XFORMOBJ_iInverse EXFORMOBJ_iInverse
FORCEINLINE
VOID
XFORMOBJ_vInit(
OUT XFORMOBJ *pxo,
IN MATRIX *pmx)
{
pxo->pmx = pmx;
}
FORCEINLINE
MATRIX*
XFORMOBJ_pmx(
IN XFORMOBJ *pxo)
{
return pxo->pmx;
}
ULONG
INTERNAL_CALL
XFORMOBJ_iSetXform(
OUT XFORMOBJ *pxo,
IN XFORML * pxform);
OUT XFORMOBJ *pxo,
IN const XFORML *pxform);
ULONG
INTERNAL_CALL
XFORMOBJ_iCombine(
IN XFORMOBJ *pxo,
IN XFORMOBJ *pxo1,
IN XFORMOBJ *pxo2);
IN XFORMOBJ *pxo,
IN XFORMOBJ *pxo1,
IN XFORMOBJ *pxo2);
ULONG
INTERNAL_CALL
XFORMOBJ_iCombineXform(
IN XFORMOBJ *pxo,
IN XFORMOBJ *pxo1,
IN XFORML *pxform,
IN BOOL bLeftMultiply);
IN XFORMOBJ *pxo,
IN XFORMOBJ *pxo1,
IN XFORML *pxform,
IN BOOL bLeftMultiply);
ULONG
INTERNAL_CALL
XFORMOBJ_Inverse(
OUT XFORMOBJ *pxoDst,
IN XFORMOBJ *pxoSrc);
XFORMOBJ_iInverse(
OUT XFORMOBJ *pxoDst,
IN XFORMOBJ *pxoSrc);
ULONG
APIENTRY
XFORMOBJ_iGetXform(
IN XFORMOBJ *pxo,
OUT XFORML *pxform);
BOOL
APIENTRY
XFORMOBJ_bApplyXform(
IN XFORMOBJ *pxo,
IN ULONG iMode,
IN ULONG cPoints,
IN PVOID pvIn,
OUT PVOID pvOut);

View file

@ -97,14 +97,14 @@ HintFromAccel(ULONG flAccel)
{
switch (flAccel & (MX_NOTRANSLATE | MX_IDENTITYSCALE | MX_SCALE))
{
case (MX_SCALE | MX_IDENTITYSCALE | MX_NOTRANSLATE):
return GX_IDENTITY;
case (MX_SCALE | MX_IDENTITYSCALE):
return GX_OFFSET;
case MX_SCALE:
return GX_SCALE;
default:
return GX_GENERAL;
case (MX_SCALE | MX_IDENTITYSCALE | MX_NOTRANSLATE):
return GX_IDENTITY;
case (MX_SCALE | MX_IDENTITYSCALE):
return GX_OFFSET;
case MX_SCALE:
return GX_SCALE;
default:
return GX_GENERAL;
}
}
@ -115,7 +115,7 @@ INTERNAL_CALL
XFORMOBJ_UpdateAccel(
IN XFORMOBJ *pxo)
{
PMATRIX pmx = (PMATRIX)pxo;
PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Copy Dx and Dy to FIX format */
pmx->fxDx = FLOATOBJ_GetFix(&pmx->efDx);
@ -124,25 +124,25 @@ XFORMOBJ_UpdateAccel(
pmx->flAccel = 0;
if (FLOATOBJ_Equal0(&pmx->efDx) &&
FLOATOBJ_Equal0(&pmx->efDy))
FLOATOBJ_Equal0(&pmx->efDy))
{
pmx->flAccel |= MX_NOTRANSLATE;
}
if (FLOATOBJ_Equal0(&pmx->efM12) &&
FLOATOBJ_Equal0(&pmx->efM21))
FLOATOBJ_Equal0(&pmx->efM21))
{
pmx->flAccel |= MX_SCALE;
}
if (FLOATOBJ_Equal1(&pmx->efM11) &&
FLOATOBJ_Equal1(&pmx->efM22))
FLOATOBJ_Equal1(&pmx->efM22))
{
pmx->flAccel |= MX_IDENTITYSCALE;
}
if (FLOATOBJ_IsLong(&pmx->efM11) && FLOATOBJ_IsLong(&pmx->efM12) &&
FLOATOBJ_IsLong(&pmx->efM21) && FLOATOBJ_IsLong(&pmx->efM22))
FLOATOBJ_IsLong(&pmx->efM21) && FLOATOBJ_IsLong(&pmx->efM22))
{
pmx->flAccel |= MX_INTEGER;
}
@ -155,9 +155,9 @@ ULONG
INTERNAL_CALL
XFORMOBJ_iSetXform(
OUT XFORMOBJ *pxo,
IN XFORML * pxform)
IN const XFORML *pxform)
{
PMATRIX pmx = (PMATRIX)pxo;
PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Check parameters */
if (!pxo || !pxform)
@ -195,9 +195,9 @@ XFORMOBJ_iCombine(
MATRIX mx;
PMATRIX pmx, pmx1, pmx2;
pmx = (PMATRIX)pxo;
pmx1 = (PMATRIX)pxo1;
pmx2 = (PMATRIX)pxo2;
pmx = XFORMOBJ_pmx(pxo);
pmx1 =XFORMOBJ_pmx(pxo1);
pmx2 = XFORMOBJ_pmx(pxo2);
/* Do a 3 x 3 matrix multiplication with mx as destinantion */
MulAdd(&mx.efM11, &pmx1->efM11, &pmx2->efM11, &pmx1->efM12, &pmx2->efM21);
@ -226,17 +226,18 @@ XFORMOBJ_iCombineXform(
IN BOOL bLeftMultiply)
{
MATRIX mx;
XFORMOBJ *pxo2 = (XFORMOBJ*)&mx;
XFORMOBJ xo2;
XFORMOBJ_iSetXform(pxo2, pxform);
XFORMOBJ_vInit(&xo2, &mx);
XFORMOBJ_iSetXform(&xo2, pxform);
if (bLeftMultiply)
{
return XFORMOBJ_iCombine(pxo, pxo2, pxo1);
return XFORMOBJ_iCombine(pxo, &xo2, pxo1);
}
else
{
return XFORMOBJ_iCombine(pxo, pxo1, pxo2);
return XFORMOBJ_iCombine(pxo, pxo1, &xo2);
}
}
@ -246,15 +247,15 @@ XFORMOBJ_iCombineXform(
*/
ULONG
INTERNAL_CALL
XFORMOBJ_Inverse(
XFORMOBJ_iInverse(
OUT XFORMOBJ *pxoDst,
IN XFORMOBJ *pxoSrc)
{
PMATRIX pmxDst, pmxSrc;
FLOATOBJ foDet;
pmxDst = (PMATRIX)pxoDst;
pmxSrc = (PMATRIX)pxoSrc;
pmxDst = XFORMOBJ_pmx(pxoDst);
pmxSrc = XFORMOBJ_pmx(pxoSrc);
/* det = M11 * M22 - M12 * M21 */
MulSub(&foDet, &pmxSrc->efM11, &pmxSrc->efM22, &pmxSrc->efM12, &pmxSrc->efM21);
@ -296,56 +297,57 @@ XFORMOBJ_bXformFixPoints(
FLOATOBJ fo1, fo2;
FLONG flAccel;
pmx = (PMATRIX)pxo;
flAccel = pmx->flAccel & (MX_INTEGER|MX_SCALE|MX_IDENTITYSCALE);
pmx = XFORMOBJ_pmx(pxo);
flAccel = pmx->flAccel;
switch (flAccel)
if ((flAccel & (MX_SCALE|MX_IDENTITYSCALE)) == (MX_SCALE|MX_IDENTITYSCALE))
{
case (MX_SCALE | MX_IDENTITYSCALE):
case (MX_SCALE | MX_IDENTITYSCALE | MX_INTEGER):
/* Identity transformation, nothing todo */
break;
case (MX_IDENTITYSCALE | MX_INTEGER):
/* 1-scale integer transform */
i = cPoints - 1;
do
}
else if (flAccel & MX_INTEGER)
{
if (flAccel & MX_IDENTITYSCALE)
{
LONG x = pptIn[i].x + pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM21);
LONG y = pptIn[i].y + pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM12);
pptOut[i].y = y;
pptOut[i].x = x;
/* 1-scale integer transform */
i = cPoints - 1;
do
{
LONG x = pptIn[i].x + pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM21);
LONG y = pptIn[i].y + pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM12);
pptOut[i].y = y;
pptOut[i].x = x;
}
while (--i >= 0);
}
while (--i >= 0);
break;
case (MX_SCALE | MX_INTEGER):
/* Diagonal integer transform */
i = cPoints - 1;
do
else if (flAccel & MX_SCALE)
{
pptOut[i].x = pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM11);
pptOut[i].y = pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM22);
/* Diagonal integer transform */
i = cPoints - 1;
do
{
pptOut[i].x = pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM11);
pptOut[i].y = pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM22);
}
while (--i >= 0);
}
while (--i >= 0);
break;
case (MX_INTEGER):
/* Full integer transform */
i = cPoints - 1;
do
else
{
LONG x;
x = pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM11);
x += pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM21);
pptOut[i].y = pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM22);
pptOut[i].y += pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM12);
pptOut[i].x = x;
/* Full integer transform */
i = cPoints - 1;
do
{
LONG x;
x = pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM11);
x += pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM21);
pptOut[i].y = pptIn[i].y * FLOATOBJ_GetLong(&pmx->efM22);
pptOut[i].y += pptIn[i].x * FLOATOBJ_GetLong(&pmx->efM12);
pptOut[i].x = x;
}
while (--i >= 0);
}
while (--i >= 0);
break;
case (MX_IDENTITYSCALE):
}
else if (flAccel & MX_IDENTITYSCALE)
{
/* 1-scale transform */
i = cPoints - 1;
do
@ -358,9 +360,9 @@ XFORMOBJ_bXformFixPoints(
pptOut[i].y = pptIn[i].y + FLOATOBJ_GetLong(&fo2);
}
while (--i >= 0);
break;
case (MX_SCALE):
}
else if (flAccel & MX_SCALE)
{
/* Diagonal float transform */
i = cPoints - 1;
do
@ -373,9 +375,9 @@ XFORMOBJ_bXformFixPoints(
pptOut[i].y = FLOATOBJ_GetLong(&fo2);
}
while (--i >= 0);
break;
default:
}
else
{
/* Full float transform */
i = cPoints - 1;
do
@ -386,7 +388,6 @@ XFORMOBJ_bXformFixPoints(
pptOut[i].y = FLOATOBJ_GetLong(&fo2);
}
while (--i >= 0);
break;
}
if (!(pmx->flAccel & MX_NOTRANSLATE))
@ -414,7 +415,7 @@ XFORMOBJ_iGetXform(
IN XFORMOBJ *pxo,
OUT XFORML *pxform)
{
PMATRIX pmx = (PMATRIX)pxo;
PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Check parameters */
if (!pxo || !pxform)
@ -442,7 +443,7 @@ XFORMOBJ_iGetFloatObjXform(
IN XFORMOBJ *pxo,
OUT FLOATOBJ_XFORM *pxfo)
{
PMATRIX pmx = (PMATRIX)pxo;
PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Check parameters */
if (!pxo || !pxfo)
@ -467,13 +468,14 @@ XFORMOBJ_iGetFloatObjXform(
BOOL
APIENTRY
XFORMOBJ_bApplyXform(
IN XFORMOBJ *pxo,
IN ULONG iMode,
IN ULONG cPoints,
IN PVOID pvIn,
OUT PVOID pvOut)
IN XFORMOBJ *pxo,
IN ULONG iMode,
IN ULONG cPoints,
IN PVOID pvIn,
OUT PVOID pvOut)
{
MATRIX mx;
XFORMOBJ xoInv;
POINTL *pptl;
INT i;
@ -486,13 +488,12 @@ XFORMOBJ_bApplyXform(
/* Use inverse xform? */
if (iMode == XF_INV_FXTOL || iMode == XF_INV_LTOL)
{
ULONG ret;
ret = XFORMOBJ_Inverse((XFORMOBJ*)&mx, pxo);
if (ret == DDI_ERROR)
XFORMOBJ_vInit(&xoInv, &mx);
if (XFORMOBJ_iInverse(&xoInv, pxo) == DDI_ERROR)
{
return FALSE;
}
pxo = (XFORMOBJ*)&mx;
pxo = &xoInv;
}
/* Convert POINTL to POINTFIX? */

View file

@ -3,6 +3,7 @@
*/
#include <win32k.h>
#undef XFORMOBJ
#define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ )

View file

@ -1,4 +1,5 @@
#include <win32k.h>
#undef XFORMOBJ
#define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ )

View file

@ -214,9 +214,9 @@
@ stdcall WNDOBJ_bEnum(ptr long ptr)
@ stdcall WNDOBJ_cEnumStart(ptr long long long)
@ stdcall WNDOBJ_vSetConsumer(ptr ptr)
@ stdcall XFORMOBJ_bApplyXform(ptr long long ptr ptr)
@ stdcall XFORMOBJ_iGetFloatObjXform(ptr ptr)
@ stdcall XFORMOBJ_iGetXform(ptr ptr)
@ stdcall XFORMOBJ_bApplyXform(ptr long long ptr ptr) EXFORMOBJ_bApplyXform
@ stdcall XFORMOBJ_iGetFloatObjXform(ptr ptr) EXFORMOBJ_iGetFloatObjXform
@ stdcall XFORMOBJ_iGetXform(ptr ptr) EXFORMOBJ_iGetXform
@ stdcall XLATEOBJ_cGetPalette(ptr long long ptr)
@ stdcall XLATEOBJ_hGetColorTransform(ptr)
@ stdcall XLATEOBJ_iXlate(ptr long)