Module: wine Branch: master Commit: 34508690cb98f9d849cc04817db77400c62513c4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=34508690cb98f9d849cc04817...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Sep 1 14:09:12 2021 +0200
gdi32: Move CombineTransform to objects.c.
And use a separated copy in ntgdi functions.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Huw Davies huw@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdi32/bitblt.c | 2 +- dlls/gdi32/dc.c | 52 +--------------------------------------------- dlls/gdi32/mapping.c | 22 ++++++++++++++++++-- dlls/gdi32/ntgdi_private.h | 2 ++ dlls/gdi32/objects.c | 24 +++++++++++++++++++++ 5 files changed, 48 insertions(+), 54 deletions(-)
diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c index 497e8a59f24..c10b9d37199 100644 --- a/dlls/gdi32/bitblt.c +++ b/dlls/gdi32/bitblt.c @@ -1070,7 +1070,7 @@ BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint, ) / det;
GetWorldTransform(hdcSrc,&SrcXf); - CombineTransform(&xf,&xf,&SrcXf); + combine_transform( &xf, &xf, &SrcXf );
/* save actual dest transform */ GetWorldTransform(hdcDest,&oldDestXf); diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 420754b555e..73b2e74174a 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -366,8 +366,7 @@ void DC_UpdateXforms( DC *dc )
oldworld2vport = dc->xformWorld2Vport; /* Combine with the world transformation */ - CombineTransform( &dc->xformWorld2Vport, &dc->xformWorld2Wnd, - &xformWnd2Vport ); + combine_transform( &dc->xformWorld2Vport, &dc->xformWorld2Wnd, &xformWnd2Vport );
/* Create inverse of world-to-viewport transformation */ dc->vport2WorldValid = DC_InvertXform( &dc->xformWorld2Vport, @@ -933,55 +932,6 @@ BOOL WINAPI NtGdiGetTransform( HDC hdc, DWORD which, XFORM *xform ) }
-/**************************************************************************** - * CombineTransform [GDI32.@] - * Combines two transformation matrices. - * - * PARAMS - * xformResult [O] Stores the result of combining the two matrices - * xform1 [I] Specifies the first matrix to apply - * xform2 [I] Specifies the second matrix to apply - * - * REMARKS - * The same matrix can be passed in for more than one of the parameters. - * - * RETURNS - * Success: TRUE. - * Failure: FALSE. Use GetLastError() to determine the cause. - */ -BOOL WINAPI CombineTransform( LPXFORM xformResult, const XFORM *xform1, - const XFORM *xform2 ) -{ - XFORM xformTemp; - - /* Check for illegal parameters */ - if (!xformResult || !xform1 || !xform2) - return FALSE; - - /* Create the result in a temporary XFORM, since xformResult may be - * equal to xform1 or xform2 */ - xformTemp.eM11 = xform1->eM11 * xform2->eM11 + - xform1->eM12 * xform2->eM21; - xformTemp.eM12 = xform1->eM11 * xform2->eM12 + - xform1->eM12 * xform2->eM22; - xformTemp.eM21 = xform1->eM21 * xform2->eM11 + - xform1->eM22 * xform2->eM21; - xformTemp.eM22 = xform1->eM21 * xform2->eM12 + - xform1->eM22 * xform2->eM22; - xformTemp.eDx = xform1->eDx * xform2->eM11 + - xform1->eDy * xform2->eM21 + - xform2->eDx; - xformTemp.eDy = xform1->eDx * xform2->eM12 + - xform1->eDy * xform2->eM22 + - xform2->eDy; - - /* Copy the result to xformResult */ - *xformResult = xformTemp; - - return TRUE; -} - - /*********************************************************************** * SetDCHook (win32u.@) * diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c index db99d6a7eb7..00b8adf11b2 100644 --- a/dlls/gdi32/mapping.c +++ b/dlls/gdi32/mapping.c @@ -347,10 +347,12 @@ BOOL WINAPI NtGdiModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode ) ret = TRUE; break; case MWT_LEFTMULTIPLY: - ret = CombineTransform( &dc->xformWorld2Wnd, xform, &dc->xformWorld2Wnd ); + combine_transform( &dc->xformWorld2Wnd, xform, &dc->xformWorld2Wnd ); + ret = TRUE; break; case MWT_RIGHTMULTIPLY: - ret = CombineTransform( &dc->xformWorld2Wnd, &dc->xformWorld2Wnd, xform ); + combine_transform( &dc->xformWorld2Wnd, &dc->xformWorld2Wnd, xform ); + ret = TRUE; break; case MWT_SET: ret = dc->attr->graphics_mode == GM_ADVANCED && @@ -414,3 +416,19 @@ BOOL WINAPI NtGdiSetVirtualResolution( HDC hdc, DWORD horz_res, DWORD vert_res, release_dc_ptr( dc ); return TRUE; } + +void combine_transform( XFORM *result, const XFORM *xform1, const XFORM *xform2 ) +{ + XFORM r; + + /* Create the result in a temporary XFORM, since result may be + * equal to xform1 or xform2 */ + r.eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21; + r.eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22; + r.eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21; + r.eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22; + r.eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx; + r.eDy = xform1->eDx * xform2->eM12 + xform1->eDy * xform2->eM22 + xform2->eDy; + + *result = r; +} diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h index 1463726d200..6701385784f 100644 --- a/dlls/gdi32/ntgdi_private.h +++ b/dlls/gdi32/ntgdi_private.h @@ -409,6 +409,8 @@ extern DWORD get_system_dpi(void) DECLSPEC_HIDDEN; extern BOOL dp_to_lp( DC *dc, POINT *points, INT count ) DECLSPEC_HIDDEN; extern void lp_to_dp( DC *dc, POINT *points, INT count ) DECLSPEC_HIDDEN; extern BOOL set_map_mode( DC *dc, int mode ) DECLSPEC_HIDDEN; +extern void combine_transform( XFORM *result, const XFORM *xform1, + const XFORM *xform2 ) DECLSPEC_HIDDEN;
/* metafile.c */ extern HMETAFILE MF_Create_HMETAFILE(METAHEADER *mh) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/objects.c b/dlls/gdi32/objects.c index d1d9cdb1e35..a79540885c3 100644 --- a/dlls/gdi32/objects.c +++ b/dlls/gdi32/objects.c @@ -977,3 +977,27 @@ INT WINAPI EnumObjects( HDC hdc, INT type, GOBJENUMPROC enum_func, LPARAM param
return retval; } + +/*********************************************************************** + * CombineTransform (GDI32.@) + * + * Combines two transformation matrices. + */ +BOOL WINAPI CombineTransform( XFORM *result, const XFORM *xform1, const XFORM *xform2 ) +{ + XFORM r; + + if (!result || !xform1 || !xform2) return FALSE; + + /* Create the result in a temporary XFORM, since result may be + * equal to xform1 or xform2 */ + r.eM11 = xform1->eM11 * xform2->eM11 + xform1->eM12 * xform2->eM21; + r.eM12 = xform1->eM11 * xform2->eM12 + xform1->eM12 * xform2->eM22; + r.eM21 = xform1->eM21 * xform2->eM11 + xform1->eM22 * xform2->eM21; + r.eM22 = xform1->eM21 * xform2->eM12 + xform1->eM22 * xform2->eM22; + r.eDx = xform1->eDx * xform2->eM11 + xform1->eDy * xform2->eM21 + xform2->eDx; + r.eDy = xform1->eDx * xform2->eM12 + xform1->eDy * xform2->eM22 + xform2->eDy; + + *result = r; + return TRUE; +}