From ca4ebe1b551d845f1f540d4a55e9c8eb8e74e9ba Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 6 Jan 2011 22:00:26 +0000 Subject: [PATCH] [WIN32K] - 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 --- .../subsystems/win32/win32k/include/coord.h | 81 ++++++++- .../win32/win32k/include/gdifloat.h | 1 + .../win32/win32k/include/xformobj.h | 72 ++++++-- .../win32/win32k/objects/xformobj.c | 169 +++++++++--------- reactos/subsystems/win32/win32k/stubs/stubs.c | 1 + .../subsystems/win32/win32k/stubs/umpdstubs.c | 1 + reactos/subsystems/win32/win32k/win32k.pspec | 6 +- 7 files changed, 225 insertions(+), 106 deletions(-) diff --git a/reactos/subsystems/win32/win32k/include/coord.h b/reactos/subsystems/win32/win32k/include/coord.h index 83f3a355eaa..af678a0efb8 100644 --- a/reactos/subsystems/win32/win32k/include/coord.h +++ b/reactos/subsystems/win32/win32k/include/coord.h @@ -1,13 +1,80 @@ #pragma once #include +#include -#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); \ No newline at end of file +PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG); diff --git a/reactos/subsystems/win32/win32k/include/gdifloat.h b/reactos/subsystems/win32/win32k/include/gdifloat.h index 5f789887784..024b50771d0 100644 --- a/reactos/subsystems/win32/win32k/include/gdifloat.h +++ b/reactos/subsystems/win32/win32k/include/gdifloat.h @@ -4,6 +4,7 @@ #include #include "dc.h" #include "math.h" +#include "xformobj.h" #include #include FT_FREETYPE_H diff --git a/reactos/subsystems/win32/win32k/include/xformobj.h b/reactos/subsystems/win32/win32k/include/xformobj.h index d9f05f7214e..6c4ab3bb4ce 100644 --- a/reactos/subsystems/win32/win32k/include/xformobj.h +++ b/reactos/subsystems/win32/win32k/include/xformobj.h @@ -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); diff --git a/reactos/subsystems/win32/win32k/objects/xformobj.c b/reactos/subsystems/win32/win32k/objects/xformobj.c index 9ba7311ef06..e5f9448a3fb 100644 --- a/reactos/subsystems/win32/win32k/objects/xformobj.c +++ b/reactos/subsystems/win32/win32k/objects/xformobj.c @@ -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? */ diff --git a/reactos/subsystems/win32/win32k/stubs/stubs.c b/reactos/subsystems/win32/win32k/stubs/stubs.c index 7685c19ad99..e2dd07daa9a 100644 --- a/reactos/subsystems/win32/win32k/stubs/stubs.c +++ b/reactos/subsystems/win32/win32k/stubs/stubs.c @@ -3,6 +3,7 @@ */ #include +#undef XFORMOBJ #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c index 9ecafb906af..a25f4369769 100644 --- a/reactos/subsystems/win32/win32k/stubs/umpdstubs.c +++ b/reactos/subsystems/win32/win32k/stubs/umpdstubs.c @@ -1,4 +1,5 @@ #include +#undef XFORMOBJ #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/reactos/subsystems/win32/win32k/win32k.pspec b/reactos/subsystems/win32/win32k/win32k.pspec index bd2a06eb746..89a895e48ac 100644 --- a/reactos/subsystems/win32/win32k/win32k.pspec +++ b/reactos/subsystems/win32/win32k/win32k.pspec @@ -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) -- 2.17.1