Jacek Caban : gdi32: Use NtGdiFillRgn for FillRgn implementation.

Alexandre Julliard julliard at winehq.org
Mon Jul 26 15:30:27 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun Jul 25 10:56:11 2021 +0200

gdi32: Use NtGdiFillRgn for FillRgn 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/enhmfdrv/graphics.c | 23 ++++++++++++++++++-----
 dlls/gdi32/gdi_private.h       |  2 ++
 dlls/gdi32/gdidc.c             | 15 +++++++++++++++
 dlls/gdi32/mfdrv/graphics.c    | 22 +++++++++++++++++-----
 dlls/gdi32/mfdrv/init.c        |  2 +-
 dlls/gdi32/mfdrv/metafiledrv.h |  1 +
 dlls/gdi32/painting.c          |  9 ++++-----
 7 files changed, 58 insertions(+), 16 deletions(-)

diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index fcaf432b57e..eadf9a1a4b9 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -810,15 +810,16 @@ BOOL CDECL EMFDRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT
 
 
 /*********************************************************************
- *          EMFDRV_FillRgn
+ *          EMFDC_FillRgn
  */
-BOOL CDECL EMFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
+BOOL EMFDC_FillRgn( DC_ATTR *dc_attr, HRGN hrgn, HBRUSH hbrush )
 {
+    EMFDRV_PDEVICE *emf = dc_attr->emf;
     EMRFILLRGN *emr;
     DWORD size, rgnsize, index;
     BOOL ret;
 
-    index = EMFDRV_CreateBrushIndirect( dev, hbrush );
+    index = EMFDRV_CreateBrushIndirect( &emf->dev, hbrush );
     if(!index) return FALSE;
 
     rgnsize = NtGdiGetRegionData( hrgn, 0, NULL );
@@ -836,12 +837,24 @@ BOOL CDECL EMFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
     emr->cbRgnData = rgnsize;
     emr->ihBrush = index;
 
-    ret = EMFDRV_WriteRecord( dev, &emr->emr );
+    ret = EMFDRV_WriteRecord( &emf->dev, &emr->emr );
     if(ret)
-        EMFDRV_UpdateBBox( dev, &emr->rclBounds );
+        EMFDRV_UpdateBBox( &emf->dev, &emr->rclBounds );
     HeapFree( GetProcessHeap(), 0, emr );
     return ret;
 }
+
+
+/*********************************************************************
+ *          EMFDRV_FillRgn
+ */
+BOOL CDECL EMFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
+{
+    /* FIXME: update bounding rect */
+    return TRUE;
+}
+
+
 /*********************************************************************
  *          EMFDRV_FrameRgn
  */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 481bc14d7f3..5714aee0099 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -49,6 +49,7 @@ extern BOOL METADC_Chord( HDC hdc, INT left, INT top, INT right, INT bottom, INT
 extern BOOL METADC_Ellipse( HDC hdc, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
 extern BOOL METADC_ExtTextOut( HDC hdc, INT x, INT y, UINT flags, const RECT *rect,
                                const WCHAR *str, UINT count, const INT *dx ) DECLSPEC_HIDDEN;
+extern BOOL METADC_FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;
 extern BOOL METADC_LineTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL METADC_MoveTo( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom,
@@ -76,6 +77,7 @@ extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right,
 extern BOOL EMFDC_EndPath( DC_ATTR *dc_attr ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *rect,
                               const WCHAR *str, UINT count, const INT *dx ) DECLSPEC_HIDDEN;
+extern BOOL EMFDC_FillRgn( DC_ATTR *dc_attr, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_LineTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_MoveTo( DC_ATTR *dc_attr, INT x, INT y ) DECLSPEC_HIDDEN;
 extern BOOL EMFDC_PolyBezier( DC_ATTR *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 209591ad0c2..956326b7c14 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -382,6 +382,21 @@ BOOL WINAPI PolyDraw( HDC hdc, const POINT *points, const BYTE *types, DWORD cou
     return NtGdiPolyDraw( hdc, points, types, count );
 }
 
+/***********************************************************************
+ *           FillRgn    (GDI32.@)
+ */
+BOOL WINAPI FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
+{
+    DC_ATTR *dc_attr;
+
+    TRACE( "%p, %p, %p\n", hdc, hrgn, hbrush );
+
+    if (is_meta_dc( hdc )) return METADC_FillRgn( hdc, hrgn, hbrush );
+    if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+    if (dc_attr->emf && !EMFDC_FillRgn( dc_attr, hrgn, hbrush )) return FALSE;
+    return NtGdiFillRgn( hdc, hrgn, hbrush );
+}
+
 /***********************************************************************
  *           ExtTextOutW    (GDI32.@)
  */
diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c
index 8b74c1a3696..56f93aa860d 100644
--- a/dlls/gdi32/mfdrv/graphics.c
+++ b/dlls/gdi32/mfdrv/graphics.c
@@ -380,18 +380,30 @@ BOOL CDECL MFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn )
 
 
 /**********************************************************************
- *          MFDRV_FillRgn
+ *          METADC_FillRgn
  */
-BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
+BOOL METADC_FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
 {
+    METAFILEDRV_PDEVICE *mf;
     INT16 iRgn, iBrush;
-    iRgn = MFDRV_CreateRegion( dev, hrgn );
+
+    if (!(mf = get_metadc_ptr( hdc ))) return FALSE;
+
+    iRgn = MFDRV_CreateRegion( &mf->dev, hrgn );
     if(iRgn == -1)
         return FALSE;
-    iBrush = MFDRV_CreateBrushIndirect( dev, hbrush );
+    iBrush = MFDRV_CreateBrushIndirect( &mf->dev, hbrush );
     if(!iBrush)
         return FALSE;
-    return MFDRV_MetaParam2( dev, META_FILLREGION, iRgn, iBrush );
+    return MFDRV_MetaParam2( &mf->dev, META_FILLREGION, iRgn, iBrush );
+}
+
+/**********************************************************************
+ *          MFDRV_FillRgn
+ */
+BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush )
+{
+    return TRUE;
 }
 
 /**********************************************************************
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index f53f8304a8e..5d32c5563de 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -597,7 +597,7 @@ BOOL MFDRV_MetaParam8(PHYSDEV dev, short func, short param1, short param2,
     return MFDRV_WriteRecord( dev, mr, mr->rdSize * 2);
 }
 
-static METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc )
+METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc )
 {
     METAFILEDRV_PDEVICE *metafile = get_gdi_client_ptr( hdc, NTGDI_OBJ_METADC );
     if (!metafile) SetLastError( ERROR_INVALID_HANDLE );
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 6b4984854ed..9809f3e2a11 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -59,6 +59,7 @@ extern UINT MFDRV_AddHandle( PHYSDEV dev, HGDIOBJ obj ) DECLSPEC_HIDDEN;
 extern BOOL MFDRV_RemoveHandle( PHYSDEV dev, UINT index ) DECLSPEC_HIDDEN;
 extern INT16 MFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) DECLSPEC_HIDDEN;
 
+extern METAFILEDRV_PDEVICE *get_metadc_ptr( HDC hdc ) DECLSPEC_HIDDEN;
 extern BOOL metadc_param2( HDC hdc, short func, short param1, short param2 ) DECLSPEC_HIDDEN;
 extern BOOL metadc_param4( HDC hdc, short func, short param1, short param2,
                            short param3, short param4 ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 1c99167e8ad..eb537a44574 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -89,7 +89,8 @@ BOOL CDECL nulldrv_FrameRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush, INT width, INT
 
     if (tmp)
     {
-        if (REGION_FrameRgn( tmp, rgn, width, height )) ret = FillRgn( dev->hdc, tmp, brush );
+        if (REGION_FrameRgn( tmp, rgn, width, height ))
+            ret = NtGdiFillRgn( dev->hdc, tmp, brush );
         DeleteObject( tmp );
     }
     return ret;
@@ -493,16 +494,14 @@ BOOL WINAPI PaintRgn( HDC hdc, HRGN hrgn )
 
 
 /***********************************************************************
- *           FillRgn    (GDI32.@)
+ *           NtGdiFillRgn    (win32u.@)
  */
-BOOL WINAPI FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
+BOOL WINAPI NtGdiFillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
 {
     PHYSDEV physdev;
     BOOL retval;
     DC * dc = get_dc_ptr( hdc );
 
-    TRACE( "%p, %p, %p\n", hdc, hrgn, hbrush );
-
     if (!dc) return FALSE;
     update_dc( dc );
     physdev = GET_DC_PHYSDEV( dc, pFillRgn );




More information about the wine-cvs mailing list