https://git.reactos.org/?p=reactos.git;a=commitdiff;h=405ce532118f5c5d7dd209...
commit 405ce532118f5c5d7dd2094aea8b65cb89c7b83f Author: Jérôme Gardou jerome.gardou@reactos.org AuthorDate: Wed Mar 17 18:43:59 2021 +0100 Commit: Jérôme Gardou zefklop@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"