Jacek Caban : gdi32: Use NtGdiGetAndSetDCDword for SetGraphicsMode.

Alexandre Julliard julliard at winehq.org
Tue Aug 31 15:40:22 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Aug 31 13:18:34 2021 +0100

gdi32: Use NtGdiGetAndSetDCDword for SetGraphicsMode.

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 |  9 ++++-----
 dlls/gdi32/dc.c     | 49 +++++++++++++++++++++++--------------------------
 dlls/gdi32/gdidc.c  |  9 +++++++++
 include/ntgdi.h     |  1 +
 4 files changed, 37 insertions(+), 31 deletions(-)

diff --git a/dlls/gdi32/bitblt.c b/dlls/gdi32/bitblt.c
index dcc2c932453..7f66d2f66fe 100644
--- a/dlls/gdi32/bitblt.c
+++ b/dlls/gdi32/bitblt.c
@@ -1019,7 +1019,7 @@ BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint,
                         HDC hdcSrc, INT nXSrc, INT nYSrc, INT nWidth,
                         INT nHeight, HBITMAP hbmMask, INT xMask, INT yMask)
 {
-    int oldgMode;
+    DWORD prev_mode;
     /* parallelogram coords */
     POINT plg[3];
     /* rect coords */
@@ -1030,8 +1030,7 @@ BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint,
     double det;
 
     /* save actual mode, set GM_ADVANCED */
-    oldgMode = SetGraphicsMode(hdcDest,GM_ADVANCED);
-    if (oldgMode == 0)
+    if (!NtGdiGetAndSetDCDword( hdcDest, NtGdiSetGraphicsMode, GM_ADVANCED, &prev_mode ))
         return FALSE;
 
     memcpy(plg,lpPoint,sizeof(POINT)*3);
@@ -1047,7 +1046,7 @@ BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint,
 
     if (fabs(det) < 1e-5)
     {
-        SetGraphicsMode(hdcDest,oldgMode);
+        NtGdiGetAndSetDCDword( hdcDest, NtGdiSetGraphicsMode, prev_mode, NULL );
         return FALSE;
     }
 
@@ -1084,7 +1083,7 @@ BOOL WINAPI PlgBlt( HDC hdcDest, const POINT *lpPoint,
             SRCCOPY);
     /* restore dest DC */
     SetWorldTransform(hdcDest,&oldDestXf);
-    SetGraphicsMode(hdcDest,oldgMode);
+    NtGdiGetAndSetDCDword( hdcDest, NtGdiSetGraphicsMode, prev_mode, NULL );
 
     return TRUE;
 }
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index 7e9dff645b1..420754b555e 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -806,6 +806,24 @@ INT WINAPI NtGdiGetDeviceCaps( HDC hdc, INT cap )
 }
 
 
+static BOOL set_graphics_mode( DC *dc, int mode )
+{
+    if (mode == dc->attr->graphics_mode) return TRUE;
+    if (mode <= 0 || mode > GM_LAST) return FALSE;
+
+    /* One would think that setting the graphics mode to GM_COMPATIBLE
+     * would also reset the world transformation matrix to the unity
+     * matrix. However, in Windows, this is not the case. This doesn't
+     * make a lot of sense to me, but that's the way it is.
+     */
+    dc->attr->graphics_mode = mode;
+
+    /* font metrics depend on the graphics mode */
+    NtGdiSelectFont(dc->hSelf, dc->hFont);
+    return TRUE;
+}
+
+
 /***********************************************************************
  *           NtGdiGetAndSetDCDword    (win32u.@)
  */
@@ -848,6 +866,11 @@ BOOL WINAPI NtGdiGetAndSetDCDword( HDC hdc, UINT method, DWORD value, DWORD *pre
         if (value != CLR_INVALID) dc->attr->pen_color = value;
         break;
 
+    case NtGdiSetGraphicsMode:
+        if (prev_value) *prev_value = dc->attr->graphics_mode;
+        ret = set_graphics_mode( dc, value );
+        break;
+
     default:
         WARN( "unknown method %u\n", method );
         ret = FALSE;
@@ -859,32 +882,6 @@ BOOL WINAPI NtGdiGetAndSetDCDword( HDC hdc, UINT method, DWORD value, DWORD *pre
 }
 
 
-/***********************************************************************
- *           SetGraphicsMode    (GDI32.@)
- */
-INT WINAPI SetGraphicsMode( HDC hdc, INT mode )
-{
-    INT ret = 0;
-    DC *dc = get_dc_ptr( hdc );
-
-    /* One would think that setting the graphics mode to GM_COMPATIBLE
-     * would also reset the world transformation matrix to the unity
-     * matrix. However, in Windows, this is not the case. This doesn't
-     * make a lot of sense to me, but that's the way it is.
-     */
-    if (!dc) return 0;
-    if ((mode > 0) && (mode <= GM_LAST))
-    {
-        ret = dc->attr->graphics_mode;
-        dc->attr->graphics_mode = mode;
-    }
-    /* font metrics depend on the graphics mode */
-    if (ret != mode) NtGdiSelectFont(dc->hSelf, dc->hFont);
-    release_dc_ptr( dc );
-    return ret;
-}
-
-
 /***********************************************************************
  *           NtGdiGetTransform    (win32u.@)
  *
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index c3c7ad710f2..0be21c75d58 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -436,6 +436,15 @@ INT WINAPI GetGraphicsMode( HDC hdc )
     return dc_attr ? dc_attr->graphics_mode : 0;
 }
 
+/***********************************************************************
+ *           SetGraphicsMode    (GDI32.@)
+ */
+INT WINAPI SetGraphicsMode( HDC hdc, INT mode )
+{
+    DWORD ret;
+    return NtGdiGetAndSetDCDword( hdc, NtGdiSetGraphicsMode, mode, &ret ) ? ret : 0;
+}
+
 /***********************************************************************
  *		GetArcDirection (GDI32.@)
  */
diff --git a/include/ntgdi.h b/include/ntgdi.h
index 25ac5ee505f..63f65e04794 100644
--- a/include/ntgdi.h
+++ b/include/ntgdi.h
@@ -111,6 +111,7 @@ enum
     NtGdiSetTextColor,
     NtGdiSetDCBrushColor,
     NtGdiSetDCPenColor,
+    NtGdiSetGraphicsMode,
 };
 
 enum




More information about the wine-cvs mailing list