From d552d7ef68d1593244e06a85df1be23f842b58c2 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Sun, 25 Jul 2021 10:56:11 +0200 Subject: [PATCH] gdi32: Use NtGdiFillRgn for FillRgn implementation. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/enhmfdrv/graphics.c | 23 ++++++++++++++++++----- dlls/gdi32/gdi_private.h | 2 ++ dlls/gdi32/gdidc.c | 15 +++++++++++++++ dlls/gdi32/mfdrv/graphics.c | 28 ++++++++++++++++++++-------- dlls/gdi32/mfdrv/init.c | 2 +- dlls/gdi32/mfdrv/metafiledrv.h | 1 + dlls/gdi32/painting.c | 9 ++++----- 7 files changed, 61 insertions(+), 19 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 @@ -379,19 +379,31 @@ BOOL CDECL MFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn ) } +/********************************************************************** + * METADC_FillRgn + */ +BOOL METADC_FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush ) +{ + METAFILEDRV_PDEVICE *mf; + INT16 iRgn, iBrush; + + if (!(mf = get_metadc_ptr( hdc ))) return FALSE; + + iRgn = MFDRV_CreateRegion( &mf->dev, hrgn ); + if(iRgn == -1) + return FALSE; + iBrush = MFDRV_CreateBrushIndirect( &mf->dev, hbrush ); + if(!iBrush) + return FALSE; + return MFDRV_MetaParam2( &mf->dev, META_FILLREGION, iRgn, iBrush ); +} + /********************************************************************** * MFDRV_FillRgn */ BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush ) { - INT16 iRgn, iBrush; - iRgn = MFDRV_CreateRegion( dev, hrgn ); - if(iRgn == -1) - return FALSE; - iBrush = MFDRV_CreateBrushIndirect( dev, hbrush ); - if(!iBrush) - return FALSE; - return MFDRV_MetaParam2( dev, META_FILLREGION, iRgn, iBrush ); + 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 );