Jacek Caban : gdi32: Use NtGdiExcludeClipRect for ExcludeClipRect implementation.

Alexandre Julliard julliard at winehq.org
Wed Aug 4 16:41:37 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug  4 11:21:13 2021 +0200

gdi32: Use NtGdiExcludeClipRect for ExcludeClipRect implementation.

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/clipping.c                | 34 ++++++++++++++++------------------
 dlls/gdi32/enhmfdrv/dc.c             |  6 ++----
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |  1 -
 dlls/gdi32/enhmfdrv/init.c           |  2 +-
 dlls/gdi32/gdi_private.h             |  4 ++++
 dlls/gdi32/gdidc.c                   | 14 ++++++++++++++
 dlls/gdi32/mfdrv/dc.c                |  4 ++--
 dlls/gdi32/mfdrv/init.c              |  2 +-
 dlls/gdi32/mfdrv/metafiledrv.h       |  1 -
 9 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c
index 9e03635a103..bea2c7f8cfc 100644
--- a/dlls/gdi32/clipping.c
+++ b/dlls/gdi32/clipping.c
@@ -191,17 +191,7 @@ INT CDECL nulldrv_ExtSelectClipRgn( PHYSDEV dev, HRGN rgn, INT mode )
 
 INT CDECL nulldrv_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
 {
-    DC *dc = get_nulldrv_dc( dev );
-    RECT rect = get_clip_rect( dc, left, top, right, bottom );
-    INT ret;
-    HRGN rgn;
-
-    if (!(rgn = CreateRectRgnIndirect( &rect ))) return ERROR;
-    if (!dc->hClipRgn) create_default_clip_region( dc );
-    ret = NtGdiCombineRgn( dc->hClipRgn, dc->hClipRgn, rgn, RGN_DIFF );
-    DeleteObject( rgn );
-    if (ret != ERROR) update_dc_clipping( dc );
-    return ret;
+    return ERROR;
 }
 
 INT CDECL nulldrv_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
@@ -296,21 +286,29 @@ INT WINAPI NtGdiOffsetClipRgn( HDC hdc, INT x, INT y )
 
 
 /***********************************************************************
- *           ExcludeClipRect    (GDI32.@)
+ *           NtGdiExcludeClipRect    (win32u.@)
  */
-INT WINAPI ExcludeClipRect( HDC hdc, INT left, INT top,
-                                INT right, INT bottom )
+INT WINAPI NtGdiExcludeClipRect( HDC hdc, INT left, INT top, INT right, INT bottom )
 {
-    PHYSDEV physdev;
-    INT ret;
+    INT ret = ERROR;
+    RECT rect;
+    HRGN rgn;
     DC *dc = get_dc_ptr( hdc );
 
     TRACE("%p %d,%d-%d,%d\n", hdc, left, top, right, bottom );
 
     if (!dc) return ERROR;
     update_dc( dc );
-    physdev = GET_DC_PHYSDEV( dc, pExcludeClipRect );
-    ret = physdev->funcs->pExcludeClipRect( physdev, left, top, right, bottom );
+
+    rect = get_clip_rect( dc, left, top, right, bottom );
+
+    if ((rgn = CreateRectRgnIndirect( &rect )))
+    {
+        if (!dc->hClipRgn) create_default_clip_region( dc );
+        ret = NtGdiCombineRgn( dc->hClipRgn, dc->hClipRgn, rgn, RGN_DIFF );
+        DeleteObject( rgn );
+        if (ret != ERROR) update_dc_clipping( dc );
+    }
     release_dc_ptr( dc );
     return ret;
 }
diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index 4b51a140c27..8508f6296be 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -146,9 +146,8 @@ BOOL EMFDC_SetArcDirection( DC_ATTR *dc_attr, INT dir )
     return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
 }
 
-INT CDECL EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
+INT EMFDC_ExcludeClipRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom )
 {
-    PHYSDEV next = GET_NEXT_PHYSDEV( dev, pExcludeClipRect );
     EMREXCLUDECLIPRECT emr;
 
     emr.emr.iType      = EMR_EXCLUDECLIPRECT;
@@ -157,8 +156,7 @@ INT CDECL EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT
     emr.rclClip.top    = top;
     emr.rclClip.right  = right;
     emr.rclClip.bottom = bottom;
-    if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR;
-    return next->funcs->pExcludeClipRect( next, left, top, right, bottom );
+    return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr );
 }
 
 BOOL EMFDC_IntersectClipRect( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom)
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index d0d7ad14878..08936a73f8f 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -70,7 +70,6 @@ extern BOOL     CDECL EMFDRV_Chord( PHYSDEV dev, INT left, INT top, INT right, I
                                     INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_DeleteObject( PHYSDEV dev, HGDIOBJ obj ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
-extern INT      CDECL EMFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
 extern INT      CDECL EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) DECLSPEC_HIDDEN;
 extern BOOL     CDECL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *lprect, LPCWSTR str,
                                          UINT count, const INT *lpDx ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 80326fe0d04..17179dd37ba 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -57,7 +57,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
     NULL,                            /* pEndPath */
     NULL,                            /* pEnumFonts */
     NULL,                            /* pEnumICMProfiles */
-    EMFDRV_ExcludeClipRect,          /* pExcludeClipRect */
+    NULL,                            /* pExcludeClipRect */
     NULL,                            /* pExtDeviceMode */
     NULL,                            /* pExtEscape */
     NULL,                            /* pExtFloodFill */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 58ea438a582..b0136e9c898 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -47,6 +47,8 @@ extern BOOL METADC_Arc( HDC hdc, INT left, INT top, INT right, INT bottom,
 extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT xstart,
                           INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
 extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
+extern BOOL METADC_ExcludeClipRect( HDC hdc, INT left, INT top, INT right,
+                                    INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL METADC_ExtFloodFill( HDC hdc, INT x, INT y, COLORREF color,
                                  UINT fill_type ) DECLSPEC_HIDDEN;
 extern BOOL METADC_ExtTextOut( HDC hdc, INT x, INT y, UINT flags, const RECT *rect,
@@ -92,6 +94,8 @@ extern BOOL EMFDC_CloseFigure( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right,
                            INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_EndPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_ExcludeClipRect( DC_ATTR *dc_attr, INT left, INT top, INT right,
+                                   INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_ExtFloodFill( DC_ATTR *dc_attr, INT x, INT y, COLORREF color,
                                 UINT fill_type ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *rect,
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index c1743498934..716b5ee28a5 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -1075,6 +1075,20 @@ INT WINAPI OffsetClipRgn( HDC hdc, INT x, INT y )
     return NtGdiOffsetClipRgn( hdc, x, y );
 }
 
+/***********************************************************************
+ *           ExcludeClipRect    (GDI32.@)
+ */
+INT WINAPI ExcludeClipRect( HDC hdc, INT left, INT top, INT right, INT bottom )
+{
+    DC_ATTR *dc_attr;
+
+    if (is_meta_dc( hdc )) return METADC_ExcludeClipRect( hdc, left, top, right, bottom );
+    if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+    if (dc_attr->emf && !EMFDC_ExcludeClipRect( dc_attr, left, top, right, bottom ))
+        return FALSE;
+    return NtGdiExcludeClipRect( hdc, left, top, right, bottom );
+}
+
 /***********************************************************************
  *           GdiSetPixelFormat   (GDI32.@)
  */
diff --git a/dlls/gdi32/mfdrv/dc.c b/dlls/gdi32/mfdrv/dc.c
index fde7bacfd11..363274a40b0 100644
--- a/dlls/gdi32/mfdrv/dc.c
+++ b/dlls/gdi32/mfdrv/dc.c
@@ -75,9 +75,9 @@ BOOL METADC_IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom
     return metadc_param4( hdc, META_INTERSECTCLIPRECT, left, top, right, bottom );
 }
 
-INT CDECL MFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom )
+BOOL METADC_ExcludeClipRect( HDC hdc, INT left, INT top, INT right, INT bottom )
 {
-    return MFDRV_MetaParam4( dev, META_EXCLUDECLIPRECT, left, top, right, bottom );
+    return metadc_param4( hdc, META_EXCLUDECLIPRECT, left, top, right, bottom );
 }
 
 BOOL METADC_OffsetClipRgn( HDC hdc, INT x, INT y )
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 01e1ee92c98..db508ea3dbd 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -122,7 +122,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
     MFDRV_EndPath,                   /* pEndPath */
     NULL,                            /* pEnumFonts */
     NULL,                            /* pEnumICMProfiles */
-    MFDRV_ExcludeClipRect,           /* pExcludeClipRect */
+    NULL,                            /* pExcludeClipRect */
     NULL,                            /* pExtDeviceMode */
     MFDRV_ExtEscape,                 /* pExtEscape */
     NULL,                            /* pExtFloodFill */
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 5b5d17859fa..17fd626c5ec 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -83,7 +83,6 @@ extern BOOL CDECL MFDRV_BeginPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL CDECL MFDRV_CloseFigure( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL CDECL MFDRV_DeleteObject( PHYSDEV dev, HGDIOBJ obj ) DECLSPEC_HIDDEN;
 extern BOOL CDECL MFDRV_EndPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
-extern INT  CDECL MFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
 extern INT  CDECL MFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) DECLSPEC_HIDDEN;
 extern BOOL CDECL MFDRV_FillPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list