Jacek Caban : gdi32: Move CombineTransform to objects.c.

Alexandre Julliard julliard at winehq.org
Wed Sep 1 15:45:10 CDT 2021


Module: wine
Branch: master
Commit: 34508690cb98f9d849cc04817db77400c62513c4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=34508690cb98f9d849cc04817db77400c62513c4

Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;
+}




More information about the wine-cvs mailing list