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