[WIN32K]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 6 Jan 2011 22:00:26 +0000 (22:00 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 6 Jan 2011 22:00:26 +0000 (22:00 +0000)
- 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

reactos/subsystems/win32/win32k/include/coord.h
reactos/subsystems/win32/win32k/include/gdifloat.h
reactos/subsystems/win32/win32k/include/xformobj.h
reactos/subsystems/win32/win32k/objects/xformobj.c
reactos/subsystems/win32/win32k/stubs/stubs.c
reactos/subsystems/win32/win32k/stubs/umpdstubs.c
reactos/subsystems/win32/win32k/win32k.pspec

index 83f3a35..af678a0 100644 (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);
\ No newline at end of file
+PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG);
index 5f78988..024b507 100644 (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
 
index d9f05f7..6c4ab3b 100644 (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);
index 9ba7311..e5f9448 100644 (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? */
index 7685c19..e2dd07d 100644 (file)
@@ -3,6 +3,7 @@
  */
 
 #include <win32k.h>
+#undef XFORMOBJ
 
 #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ )
 
index 9ecafb9..a25f436 100644 (file)
@@ -1,4 +1,5 @@
 #include <win32k.h>
+#undef XFORMOBJ
 
 #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ )
 
index bd2a06e..89a895e 100644 (file)
 @ 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)