https://git.reactos.org/?p=reactos.git;a=commitdiff;h=405ce532118f5c5d7dd20…
commit 405ce532118f5c5d7dd2094aea8b65cb89c7b83f
Author: Jérôme Gardou <jerome.gardou(a)reactos.org>
AuthorDate: Wed Mar 17 18:43:59 2021 +0100
Commit: Jérôme Gardou <zefklop(a)users.noreply.github.com>
CommitDate: Wed Mar 31 18:35:31 2021 +0200
[WIN32K] More cleanup & improvements
Use FLOATOBJs to perform device<->world transformations, avoiding use of
XFORMOBJ all the time
Remove unused macros & functions
---
win32ss/gdi/ntgdi/coord.c | 37 +++++++------
win32ss/gdi/ntgdi/coord.h | 123 ++++++++++++++++++++++++++-----------------
win32ss/gdi/ntgdi/dcutil.c | 4 +-
win32ss/gdi/ntgdi/gdifloat.h | 75 --------------------------
win32ss/win32kp.h | 1 -
5 files changed, 96 insertions(+), 144 deletions(-)
diff --git a/win32ss/gdi/ntgdi/coord.c b/win32ss/gdi/ntgdi/coord.c
index bea04e28aa0..e0d05971697 100644
--- a/win32ss/gdi/ntgdi/coord.c
+++ b/win32ss/gdi/ntgdi/coord.c
@@ -416,11 +416,11 @@ NtGdiTransformPoints(
switch (iMode)
{
case GdiDpToLp:
- DC_vXformDeviceToWorld(pdc, Count, Points, Points);
+ ret = INTERNAL_APPLY_MATRIX(DC_pmxDeviceToWorld(pdc), Points, Count);
break;
case GdiLpToDp:
- DC_vXformWorldToDevice(pdc, Count, Points, Points);
+ ret = INTERNAL_APPLY_MATRIX(DC_pmxWorldToDevice(pdc), Points, Count);
break;
case 2: // Not supported yet. Need testing.
@@ -432,17 +432,20 @@ NtGdiTransformPoints(
}
}
- _SEH2_TRY
- {
- /* Pointer was already probed! */
- RtlCopyMemory(UnsafePtOut, Points, Size);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ if (ret)
{
- /* Do not set last error */
- ret = 0;
+ _SEH2_TRY
+ {
+ /* Pointer was already probed! */
+ RtlCopyMemory(UnsafePtOut, Points, Size);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Do not set last error */
+ ret = FALSE;
+ }
+ _SEH2_END;
}
- _SEH2_END;
//
// If we are getting called that means User XForms is a mess!
@@ -866,22 +869,22 @@ IntGdiSetMapMode(
break;
case MM_LOENGLISH:
- pdcattr->szlWindowExt.cx = MulDiv(1000, pdcattr->szlVirtualDeviceMm.cx,
254);
- pdcattr->szlWindowExt.cy = MulDiv(1000, pdcattr->szlVirtualDeviceMm.cy,
254);
+ pdcattr->szlWindowExt.cx = EngMulDiv(1000,
pdcattr->szlVirtualDeviceMm.cx, 254);
+ pdcattr->szlWindowExt.cy = EngMulDiv(1000,
pdcattr->szlVirtualDeviceMm.cy, 254);
pdcattr->szlViewportExt.cx = pdcattr->szlVirtualDevicePixel.cx;
pdcattr->szlViewportExt.cy = -pdcattr->szlVirtualDevicePixel.cy;
break;
case MM_HIENGLISH:
- pdcattr->szlWindowExt.cx = MulDiv(10000,
pdcattr->szlVirtualDeviceMm.cx, 254);
- pdcattr->szlWindowExt.cy = MulDiv(10000,
pdcattr->szlVirtualDeviceMm.cy, 254);
+ pdcattr->szlWindowExt.cx = EngMulDiv(10000,
pdcattr->szlVirtualDeviceMm.cx, 254);
+ pdcattr->szlWindowExt.cy = EngMulDiv(10000,
pdcattr->szlVirtualDeviceMm.cy, 254);
pdcattr->szlViewportExt.cx = pdcattr->szlVirtualDevicePixel.cx;
pdcattr->szlViewportExt.cy = -pdcattr->szlVirtualDevicePixel.cy;
break;
case MM_TWIPS:
- pdcattr->szlWindowExt.cx = MulDiv(14400,
pdcattr->szlVirtualDeviceMm.cx, 254);
- pdcattr->szlWindowExt.cy = MulDiv(14400,
pdcattr->szlVirtualDeviceMm.cy, 254);
+ pdcattr->szlWindowExt.cx = EngMulDiv(14400,
pdcattr->szlVirtualDeviceMm.cx, 254);
+ pdcattr->szlWindowExt.cy = EngMulDiv(14400,
pdcattr->szlVirtualDeviceMm.cy, 254);
pdcattr->szlViewportExt.cx = pdcattr->szlVirtualDevicePixel.cx;
pdcattr->szlViewportExt.cy = -pdcattr->szlVirtualDevicePixel.cy;
break;
diff --git a/win32ss/gdi/ntgdi/coord.h b/win32ss/gdi/ntgdi/coord.h
index a62abadabbe..e8d159926d1 100644
--- a/win32ss/gdi/ntgdi/coord.h
+++ b/win32ss/gdi/ntgdi/coord.h
@@ -4,21 +4,58 @@
#define MIN_COORD (INT_MIN / 16)
#define MAX_COORD (INT_MAX / 16)
-#define IntLPtoDP(pdc, ppt, count) do { \
- DC_vUpdateWorldToDevice(pdc); \
- INTERNAL_LPTODP(pdc, ppt, count); \
- } while (0)
-#define CoordLPtoDP(pdc, ppt) \
- DC_vXformWorldToDevice(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
-#define IntDPtoLP(pdc, ppt, count) do { \
- DC_vUpdateDeviceToWorld(pdc); \
- DC_vXformDeviceToWorld(pdc, count, (PPOINTL)(ppt), (PPOINTL)(ppt)); \
- } while (0)
-#define CoordDPtoLP(pdc, ppt) \
- DC_vXformDeviceToWorld(pdc, 1, (PPOINTL)(ppt), (PPOINTL)(ppt));
+/*
+ * Applies matrix (which is made of FLOATOBJs) to the points array, which are made of
integers.
+ */
+static
+inline
+BOOLEAN
+INTERNAL_APPLY_MATRIX(PMATRIX matrix, LPPOINT points, UINT count)
+{
+ while (count--)
+ {
+ FLOATOBJ x, y;
+ FLOATOBJ tmp;
+
+ /* x = x * matrix->efM11 + y * matrix->efM21 + matrix->efDx; */
+ FLOATOBJ_SetLong(&x, points[count].x);
+ FLOATOBJ_Mul(&x, &matrix->efM11);
+ tmp = matrix->efM21;
+ FLOATOBJ_MulLong(&tmp, points[count].y);
+ FLOATOBJ_Add(&x, &tmp);
+ FLOATOBJ_Add(&x, &matrix->efDx);
+
+ /* y = x * matrix->efM12 + y * matrix->efM22 + matrix->efDy; */
+ FLOATOBJ_SetLong(&y, points[count].y);
+ FLOATOBJ_Mul(&y, &matrix->efM22);
+ tmp = matrix->efM12;
+ FLOATOBJ_MulLong(&tmp, points[count].x);
+ FLOATOBJ_Add(&y, &tmp);
+ FLOATOBJ_Add(&y, &matrix->efDy);
+
+ if (!FLOATOBJ_bConvertToLong(&x, &points[count].x))
+ return FALSE;
+ if (!FLOATOBJ_bConvertToLong(&y, &points[count].y))
+ return FALSE;
+ }
+ return TRUE;
+}
-#define XForm2MatrixS(m, x) XFormToMatrix(m, (XFORML*)x)
-#define MatrixS2XForm(x, m) MatrixToXForm((XFORML*)x, m)
+static
+inline
+BOOLEAN
+INTERNAL_LPTODP(DC *dc, LPPOINT points, UINT count)
+{
+ return INTERNAL_APPLY_MATRIX(&dc->pdcattr->mxWorldToDevice, points,
count);
+}
+
+static
+inline
+BOOLEAN
+INTERNAL_DPTOLP(DC *dc, LPPOINT points, UINT count)
+{
+ return INTERNAL_APPLY_MATRIX(&dc->pdcattr->mxDeviceToWorld, points,
count);
+}
FORCEINLINE
void
@@ -121,41 +158,6 @@ DC_pmxDeviceToWorld(PDC pdc)
return &pdc->pdcattr->mxDeviceToWorld;
}
-FORCEINLINE
-VOID
-DC_vXformDeviceToWorld(
- IN PDC pdc,
- IN ULONG cNumPoints,
- OUT PPOINTL pptlDest,
- IN PPOINTL pptlSource)
-{
- XFORMOBJ xo;
- PMATRIX pmx;
-
- pmx = DC_pmxDeviceToWorld(pdc);
- if (!MX_IsInvertible(pmx))
- return;
-
- XFORMOBJ_vInit(&xo, pmx);
- XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
-}
-
-FORCEINLINE
-VOID
-DC_vXformWorldToDevice(
- IN PDC pdc,
- IN ULONG cNumPoints,
- OUT PPOINTL pptlDest,
- IN PPOINTL pptlSource)
-{
- XFORMOBJ xo;
- PMATRIX pmx;
-
- pmx = DC_pmxWorldToDevice(pdc);
- XFORMOBJ_vInit(&xo, pmx);
- XFORMOBJ_bApplyXform(&xo, XF_LTOL, cNumPoints, pptlDest, pptlSource);
-}
-
BOOL
NTAPI
GreModifyWorldTransform(
@@ -173,3 +175,26 @@ BOOL WINAPI GreGetViewportExtEx( _In_ HDC hdc, _Out_ LPSIZE lpSize);
BOOL FASTCALL GreSetViewportOrgEx(HDC,int,int,LPPOINT);
BOOL WINAPI GreGetDCOrgEx(_In_ HDC, _Out_ PPOINTL, _Out_ PRECTL);
BOOL WINAPI GreSetDCOrg(_In_ HDC, _In_ LONG, _In_ LONG, _In_opt_ PRECTL);
+
+static
+inline
+BOOLEAN
+IntLPtoDP(DC* pdc, PPOINTL ppt, UINT count)
+{
+ DC_vUpdateWorldToDevice(pdc);
+ return INTERNAL_LPTODP(pdc, (LPPOINT)ppt, count);
+}
+#define CoordLPtoDP(pdc, ppt) INTERNAL_LPTODP(pdc, ppt, 1)
+
+static
+inline
+BOOLEAN
+IntDPtoLP(DC* pdc, PPOINTL ppt, UINT count)
+{
+ DC_vUpdateDeviceToWorld(pdc);
+ return INTERNAL_DPTOLP(pdc, (LPPOINT)ppt, count);
+}
+#define CoordDPtoLP(pdc, ppt) INTERNAL_DPTOLP(pdc, ppt, 1)
+
+#define XForm2MatrixS(m, x) XFormToMatrix(m, (XFORML*)x)
+#define MatrixS2XForm(x, m) MatrixToXForm((XFORML*)x, m)
diff --git a/win32ss/gdi/ntgdi/dcutil.c b/win32ss/gdi/ntgdi/dcutil.c
index 056fd7f2140..cb41e6cfcd5 100644
--- a/win32ss/gdi/ntgdi/dcutil.c
+++ b/win32ss/gdi/ntgdi/dcutil.c
@@ -743,7 +743,7 @@ NtGdiGetBoundsRect(
DPRINT(" r %d b %d\n",rc.right,rc.bottom);
ret = DCB_SET;
}
- IntDPtoLP( pdc, &rc, 2 );
+ IntDPtoLP(pdc, (PPOINTL)&rc, 2);
DPRINT("rc1 l %d t %d\n",rc.left,rc.top);
DPRINT(" r %d b %d\n",rc.right,rc.bottom);
}
@@ -838,7 +838,7 @@ NtGdiSetBoundsRect(
RECTL_vMakeWellOrdered(&rcl);
if (!(flags & DCB_WINDOWMGR))
- {
+ {
IntLPtoDP( pdc, (POINT *)&rcl, 2 );
RECTL_bUnionRect(&pdc->erclBoundsApp, &pdc->erclBoundsApp,
&rcl);
}
diff --git a/win32ss/gdi/ntgdi/gdifloat.h b/win32ss/gdi/ntgdi/gdifloat.h
deleted file mode 100644
index 86962ece449..00000000000
--- a/win32ss/gdi/ntgdi/gdifloat.h
+++ /dev/null
@@ -1,75 +0,0 @@
-#pragma once
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:28110) // disable "Drivers must protect floating point
hardware state" warning
-#endif
-
-static __inline INT GDI_ROUND(FLOAT val)
-{
- return (int)floor(val + 0.5);
-}
-
-
-/*
- * Performs a world-to-viewport transformation on the specified point,
- * which is in integer format.
- */
-static
-inline
-VOID
-INTERNAL_LPTODP(DC *dc, LPPOINT point, UINT Count)
-{
- MATRIX* WorldToDevice = &dc->pdcattr->mxWorldToDevice;
-
- while (Count--)
- {
- FLOATOBJ x, y;
- FLOATOBJ tmp;
-
- /* x = x * mxWorldToDevice.efM11 + y * mxWorldToDevice.efM21 +
mxWorldToDevice.efDx; */
- FLOATOBJ_SetLong(&x, point[Count].x);
- FLOATOBJ_Mul(&x, &WorldToDevice->efM11);
- tmp = WorldToDevice->efM21;
- FLOATOBJ_MulLong(&tmp, point[Count].y);
- FLOATOBJ_Add(&x, &tmp);
- FLOATOBJ_Add(&x, &WorldToDevice->efDx);
-
- /* y = x * mxWorldToDevice.efM12 + y * mxWorldToDevice.efM22 +
mxWorldToDevice.efDy; */
- FLOATOBJ_SetLong(&y, point[Count].y);
- FLOATOBJ_Mul(&y, &WorldToDevice->efM22);
- tmp = WorldToDevice->efM12;
- FLOATOBJ_MulLong(&tmp, point[Count].x);
- FLOATOBJ_Add(&y, &tmp);
- FLOATOBJ_Add(&y, &WorldToDevice->efDy);
-
- point[Count].x = FLOATOBJ_GetLong(&x);
- point[Count].y = FLOATOBJ_GetLong(&y);
- }
-}
-
-#define MulDiv( x, y, z ) EngMulDiv( x, y, z )
-
-#define XDPTOLP(pdcattr,tx) \
- (MulDiv(((tx)-(pdcattr)->ptlViewportOrg.x), (pdcattr)->szlWindowExt.cx,
(pdcattr)->szlViewportExt.cx) + (pdcattr)->ptlWindowOrg.x)
-#define YDPTOLP(pdcattr,ty) \
- (MulDiv(((ty)-(pdcattr)->ptlViewportOrg.y), (pdcattr)->szlWindowExt.cy,
(pdcattr)->szlViewportExt.cy) + (pdcattr)->ptlWindowOrg.y)
-#define XLPTODP(pdcattr,tx) \
- (MulDiv(((tx)-(pdcattr)->ptlWindowOrg.x), (pdcattr)->szlViewportExt.cx,
(pdcattr)->szlWindowExt.cx) + (pdcattr)->ptlViewportOrg.x)
-#define YLPTODP(pdcattr,ty) \
- (MulDiv(((ty)-(pdcattr)->ptlWindowOrg.y), (pdcattr)->szlViewportExt.cy,
(pdcattr)->szlWindowExt.cy) + (pdcattr)->ptlViewportOrg.y)
-
- /* Device <-> logical size conversion */
-
-#define XDSTOLS(pdcattr,tx) \
- MulDiv((tx), (pdcattr)->szlWindowExt.cx, (pdcattr)->szlViewportExt.cx)
-#define YDSTOLS(DC_Attr,ty) \
- MulDiv((ty), (pdcattr)->szlWindowExt.cy, (pdcattr)->szlViewportExt.cy)
-#define XLSTODS(pdcattr,tx) \
- MulDiv((tx), (pdcattr)->szlViewportExt.cx, (pdcattr)->szlWindowExt.cx)
-#define YLSTODS(pdcattr,ty) \
- MulDiv((ty), (pdcattr)->szlViewportExt.cy, (pdcattr)->szlWindowExt.cy)
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
diff --git a/win32ss/win32kp.h b/win32ss/win32kp.h
index 2d0f358597c..06ff74638ff 100644
--- a/win32ss/win32kp.h
+++ b/win32ss/win32kp.h
@@ -49,7 +49,6 @@ typedef struct _DC *PDC;
#include "gdi/ntgdi/pen.h"
#include "gdi/ntgdi/cliprgn.h"
#include "gdi/ntgdi/coord.h"
-#include "gdi/ntgdi/gdifloat.h"
#include "gdi/ntgdi/path.h"
#include "gdi/dib/dib.h"
#include "reactx/ntddraw/intddraw.h"