Author: tkreuzer
Date: Thu Jan 6 22:00:26 2011
New Revision: 50307
URL:
http://svn.reactos.org/svn/reactos?rev=50307&view=rev
Log:
[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.
Modified:
trunk/reactos/subsystems/win32/win32k/include/coord.h
trunk/reactos/subsystems/win32/win32k/include/gdifloat.h
trunk/reactos/subsystems/win32/win32k/include/xformobj.h
trunk/reactos/subsystems/win32/win32k/objects/xformobj.c
trunk/reactos/subsystems/win32/win32k/stubs/stubs.c
trunk/reactos/subsystems/win32/win32k/stubs/umpdstubs.c
trunk/reactos/subsystems/win32/win32k/win32k.pspec
Modified: trunk/reactos/subsystems/win32/win32k/include/coord.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/coord.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/coord.h [iso-8859-1] Thu Jan 6 22:00:26
2011
@@ -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 @@
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);
Modified: trunk/reactos/subsystems/win32/win32k/include/gdifloat.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/gdifloat.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/gdifloat.h [iso-8859-1] Thu Jan 6
22:00:26 2011
@@ -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
Modified: trunk/reactos/subsystems/win32/win32k/include/xformobj.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/in…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/include/xformobj.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/include/xformobj.h [iso-8859-1] Thu Jan 6
22:00:26 2011
@@ -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);
Modified: trunk/reactos/subsystems/win32/win32k/objects/xformobj.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ob…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/objects/xformobj.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/objects/xformobj.c [iso-8859-1] Thu Jan 6
22:00:26 2011
@@ -97,14 +97,14 @@
{
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 @@
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 @@
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 @@
INTERNAL_CALL
XFORMOBJ_iSetXform(
OUT XFORMOBJ *pxo,
- IN XFORML * pxform)
-{
- PMATRIX pmx = (PMATRIX)pxo;
+ IN const XFORML *pxform)
+{
+ PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Check parameters */
if (!pxo || !pxform)
@@ -195,9 +195,9 @@
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 @@
IN BOOL bLeftMultiply)
{
MATRIX mx;
- XFORMOBJ *pxo2 = (XFORMOBJ*)&mx;
-
- XFORMOBJ_iSetXform(pxo2, pxform);
+ XFORMOBJ xo2;
+
+ 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 @@
*/
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 @@
FLOATOBJ fo1, fo2;
FLONG flAccel;
- pmx = (PMATRIX)pxo;
- flAccel = pmx->flAccel & (MX_INTEGER|MX_SCALE|MX_IDENTITYSCALE);
-
- switch (flAccel)
- {
- case (MX_SCALE | MX_IDENTITYSCALE):
- case (MX_SCALE | MX_IDENTITYSCALE | MX_INTEGER):
+ pmx = XFORMOBJ_pmx(pxo);
+ flAccel = pmx->flAccel;
+
+ if ((flAccel & (MX_SCALE|MX_IDENTITYSCALE)) == (MX_SCALE|MX_IDENTITYSCALE))
+ {
/* Identity transformation, nothing todo */
- break;
-
- case (MX_IDENTITYSCALE | MX_INTEGER):
- /* 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);
- break;
-
- case (MX_SCALE | MX_INTEGER):
- /* 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);
- break;
-
- case (MX_INTEGER):
- /* 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);
- break;
-
- case (MX_IDENTITYSCALE):
+ }
+ else if (flAccel & MX_INTEGER)
+ {
+ if (flAccel & MX_IDENTITYSCALE)
+ {
+ /* 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);
+ }
+ else if (flAccel & MX_SCALE)
+ {
+ /* 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);
+ }
+ else
+ {
+ /* 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);
+ }
+ }
+ else if (flAccel & MX_IDENTITYSCALE)
+ {
/* 1-scale transform */
i = cPoints - 1;
do
@@ -358,9 +360,9 @@
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 @@
pptOut[i].y = FLOATOBJ_GetLong(&fo2);
}
while (--i >= 0);
- break;
-
- default:
+ }
+ else
+ {
/* Full float transform */
i = cPoints - 1;
do
@@ -386,7 +388,6 @@
pptOut[i].y = FLOATOBJ_GetLong(&fo2);
}
while (--i >= 0);
- break;
}
if (!(pmx->flAccel & MX_NOTRANSLATE))
@@ -414,7 +415,7 @@
IN XFORMOBJ *pxo,
OUT XFORML *pxform)
{
- PMATRIX pmx = (PMATRIX)pxo;
+ PMATRIX pmx = XFORMOBJ_pmx(pxo);
/* Check parameters */
if (!pxo || !pxform)
@@ -442,7 +443,7 @@
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 @@
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 @@
/* 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? */
Modified: trunk/reactos/subsystems/win32/win32k/stubs/stubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/st…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/stubs/stubs.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/stubs/stubs.c [iso-8859-1] Thu Jan 6 22:00:26
2011
@@ -3,6 +3,7 @@
*/
#include <win32k.h>
+#undef XFORMOBJ
#define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__,
__LINE__, __FUNCTION__ )
Modified: trunk/reactos/subsystems/win32/win32k/stubs/umpdstubs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/st…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/stubs/umpdstubs.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/stubs/umpdstubs.c [iso-8859-1] Thu Jan 6
22:00:26 2011
@@ -1,4 +1,5 @@
#include <win32k.h>
+#undef XFORMOBJ
#define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__,
__LINE__, __FUNCTION__ )
Modified: trunk/reactos/subsystems/win32/win32k/win32k.pspec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/wi…
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/win32k.pspec [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/win32k.pspec [iso-8859-1] Thu Jan 6 22:00:26
2011
@@ -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)