Jacek Caban : gdi32: Use NtGdiModifyWorldTransform for ModifyWorldTransform.

Alexandre Julliard julliard at winehq.org
Fri Aug 13 14:44:14 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Aug 13 12:07:48 2021 +0200

gdi32: Use NtGdiModifyWorldTransform for ModifyWorldTransform.

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/enhmfdrv/dc.c             | 12 ++-------
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |  1 -
 dlls/gdi32/enhmfdrv/init.c           |  2 +-
 dlls/gdi32/gdi_private.h             |  2 ++
 dlls/gdi32/gdidc.c                   | 12 +++++++++
 dlls/gdi32/mapping.c                 | 48 ++++++++++++++++--------------------
 include/ntgdi.h                      |  1 +
 7 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 4e7602f1f38..744ef47a97f 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -318,12 +318,9 @@ BOOL CDECL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform)
     return ret;
 }
 
-BOOL CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode)
+BOOL EMFDC_ModifyWorldTransform( DC_ATTR *dc_attr, const XFORM *xform, DWORD mode )
 {
-    PHYSDEV next = GET_NEXT_PHYSDEV( dev, pModifyWorldTransform );
-    EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
     EMRMODIFYWORLDTRANSFORM emr;
-    BOOL ret;
 
     emr.emr.iType = EMR_MODIFYWORLDTRANSFORM;
     emr.emr.nSize = sizeof(emr);
@@ -341,12 +338,7 @@ BOOL CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD m
         emr.xform = *xform;
     }
     emr.iMode = mode;
-
-    if (!EMFDRV_WriteRecord( dev, &emr.emr )) return FALSE;
-    physDev->modifying_transform++;
-    ret = next->funcs->pModifyWorldTransform( next, xform, mode );
-    physDev->modifying_transform--;
-    return ret;
+    return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
 }
 
 BOOL EMFDC_SetMapperFlags( DC_ATTR *dc_attr, DWORD flags )
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index ae7fa9bdd9a..d2db67cd03e 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -81,7 +81,6 @@ extern BOOL     CDECL EMFDRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, U
                                            void *grad_array, ULONG ngrad, ULONG mode ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_LineTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
-extern BOOL     CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_Pie( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
                                   INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index e9b0e5a9873..e6b501aaf77 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -94,7 +94,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
     EMFDRV_GradientFill,             /* pGradientFill */
     EMFDRV_InvertRgn,                /* pInvertRgn */
     EMFDRV_LineTo,                   /* pLineTo */
-    EMFDRV_ModifyWorldTransform,     /* pModifyWorldTransform */
+    NULL,                            /* pModifyWorldTransform */
     NULL,                            /* pMoveTo */
     NULL,                            /* pPaintRgn */
     EMFDRV_PatBlt,                   /* pPatBlt */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 305dec43c7f..f3fb35c3834 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -143,6 +143,8 @@ extern BOOL EMFDC_IntersectClipRect( DC_ATTR *dc_attr, INT left, INT top, INT ri
                                      INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_InvertRgn( DC_ATTR *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_LineTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_ModifyWorldTransform( DC_ATTR *dc_attr, const XFORM *xform,
+                                        DWORD mode ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_MoveTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_OffsetClipRgn( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_PaintRgn( DC_ATTR *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index b8faf9fb58c..e4f26742c9f 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -601,6 +601,18 @@ BOOL WINAPI GetWorldTransform( HDC hdc, XFORM *xform )
     return NtGdiGetTransform( hdc, 0x203, xform );
 }
 
+/****************************************************************************
+ *           ModifyWorldTransform   (GDI32.@)
+ */
+BOOL WINAPI ModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode )
+{
+    DC_ATTR *dc_attr;
+
+    if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+    if (dc_attr->emf && !EMFDC_ModifyWorldTransform( dc_attr, xform, mode )) return FALSE;
+    return NtGdiModifyWorldTransform( hdc, xform, mode );
+}
+
 /***********************************************************************
  *		SetStretchBltMode (GDI32.@)
  */
diff --git a/dlls/gdi32/mapping.c b/dlls/gdi32/mapping.c
index f21b965bc4b..d30d98b8592 100644
--- a/dlls/gdi32/mapping.c
+++ b/dlls/gdi32/mapping.c
@@ -143,28 +143,6 @@ BOOL set_map_mode( DC *dc, int mode )
 
 BOOL CDECL nulldrv_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode )
 {
-    DC *dc = get_nulldrv_dc( dev );
-
-    switch (mode)
-    {
-    case MWT_IDENTITY:
-        dc->xformWorld2Wnd.eM11 = 1.0f;
-        dc->xformWorld2Wnd.eM12 = 0.0f;
-        dc->xformWorld2Wnd.eM21 = 0.0f;
-        dc->xformWorld2Wnd.eM22 = 1.0f;
-        dc->xformWorld2Wnd.eDx  = 0.0f;
-        dc->xformWorld2Wnd.eDy  = 0.0f;
-        break;
-    case MWT_LEFTMULTIPLY:
-        CombineTransform( &dc->xformWorld2Wnd, xform, &dc->xformWorld2Wnd );
-        break;
-    case MWT_RIGHTMULTIPLY:
-        CombineTransform( &dc->xformWorld2Wnd, &dc->xformWorld2Wnd, xform );
-        break;
-    default:
-        return FALSE;
-    }
-    DC_UpdateXforms( dc );
     return TRUE;
 }
 
@@ -361,9 +339,9 @@ BOOL WINAPI NtGdiScaleWindowExtEx( HDC hdc, INT x_num, INT x_denom,
 
 
 /****************************************************************************
- *           ModifyWorldTransform   (GDI32.@)
+ *           NtGdiModifyWorldTransform   (win32u.@)
  */
-BOOL WINAPI ModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode )
+BOOL WINAPI NtGdiModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode )
 {
     BOOL ret = FALSE;
     DC *dc;
@@ -371,9 +349,25 @@ BOOL WINAPI ModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode )
     if (!xform && mode != MWT_IDENTITY) return FALSE;
     if ((dc = get_dc_ptr( hdc )))
     {
-        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pModifyWorldTransform );
-        if (dc->attr->graphics_mode == GM_ADVANCED)
-            ret = physdev->funcs->pModifyWorldTransform( physdev, xform, mode );
+        switch (mode)
+        {
+        case MWT_IDENTITY:
+            dc->xformWorld2Wnd.eM11 = 1.0f;
+            dc->xformWorld2Wnd.eM12 = 0.0f;
+            dc->xformWorld2Wnd.eM21 = 0.0f;
+            dc->xformWorld2Wnd.eM22 = 1.0f;
+            dc->xformWorld2Wnd.eDx  = 0.0f;
+            dc->xformWorld2Wnd.eDy  = 0.0f;
+            ret = TRUE;
+            break;
+        case MWT_LEFTMULTIPLY:
+            ret = CombineTransform( &dc->xformWorld2Wnd, xform, &dc->xformWorld2Wnd );
+            break;
+        case MWT_RIGHTMULTIPLY:
+            ret = CombineTransform( &dc->xformWorld2Wnd, &dc->xformWorld2Wnd, xform );
+            break;
+        }
+        if (ret) DC_UpdateXforms( dc );
         release_dc_ptr( dc );
     }
     return ret;
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 5d67798052a..9aeaea5d3cb 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -229,6 +229,7 @@ BOOL     WINAPI NtGdiFontIsLinked( HDC hdc );
 INT      WINAPI NtGdiIntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom );
 BOOL     WINAPI NtGdiInvertRgn( HDC hdc, HRGN hrgn );
 BOOL     WINAPI NtGdiLineTo( HDC hdc, INT x, INT y );
+BOOL     WINAPI NtGdiModifyWorldTransform( HDC hdc, const XFORM *xform, DWORD mode );
 BOOL     WINAPI NtGdiMoveTo( HDC hdc, INT x, INT y, POINT *pt );
 INT      WINAPI NtGdiOffsetClipRgn( HDC hdc, INT x, INT y );
 INT      WINAPI NtGdiOffsetRgn( HRGN hrgn, INT x, INT y );




More information about the wine-cvs mailing list