Jacek Caban : gdi32: Use NtGdiFillRgn for PaintRgn implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jul 26 15:30:27 CDT 2021
Module: wine
Branch: master
Commit: a3a5c7048fca8a489f5f903478a1c9e404248fbd
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a3a5c7048fca8a489f5f903478a1c9e404248fbd
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Jul 25 10:56:36 2021 +0200
gdi32: Use NtGdiFillRgn for PaintRgn 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/enhmetafiledrv.h | 1 -
dlls/gdi32/enhmfdrv/graphics.c | 6 +++---
dlls/gdi32/enhmfdrv/init.c | 2 +-
dlls/gdi32/gdi_private.h | 2 ++
dlls/gdi32/gdidc.c | 15 +++++++++++++++
dlls/gdi32/mfdrv/graphics.c | 10 ++++++----
dlls/gdi32/mfdrv/init.c | 2 +-
dlls/gdi32/mfdrv/metafiledrv.h | 2 --
dlls/gdi32/painting.c | 27 +++------------------------
9 files changed, 31 insertions(+), 36 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index e9ef3159888..fd2f85ba1d1 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -90,7 +90,6 @@ extern BOOL CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xfo
extern INT CDECL EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
-extern BOOL CDECL EMFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) DECLSPEC_HIDDEN;
extern BOOL CDECL EMFDRV_Pie( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index eadf9a1a4b9..64b85c44cb1 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -925,11 +925,11 @@ static BOOL EMFDRV_PaintInvertRgn( PHYSDEV dev, HRGN hrgn, DWORD iType )
}
/**********************************************************************
- * EMFDRV_PaintRgn
+ * EMFDC_PaintRgn
*/
-BOOL CDECL EMFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn )
+BOOL EMFDC_PaintRgn( DC_ATTR *dc_attr, HRGN hrgn )
{
- return EMFDRV_PaintInvertRgn( dev, hrgn, EMR_PAINTRGN );
+ return EMFDRV_PaintInvertRgn( dc_attr->emf, hrgn, EMR_PAINTRGN );
}
/**********************************************************************
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index b57bb2d2f64..ad5e05a534d 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -102,7 +102,7 @@ static const struct gdi_dc_funcs emfdrv_driver =
EMFDRV_OffsetClipRgn, /* pOffsetClipRgn */
EMFDRV_OffsetViewportOrgEx, /* pOffsetViewportOrgEx */
EMFDRV_OffsetWindowOrgEx, /* pOffsetWindowOrgEx */
- EMFDRV_PaintRgn, /* pPaintRgn */
+ NULL, /* pPaintRgn */
EMFDRV_PatBlt, /* pPatBlt */
EMFDRV_Pie, /* pPie */
EMFDRV_PolyBezier, /* pPolyBezier */
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 5714aee0099..fcf0a1647b3 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -52,6 +52,7 @@ extern BOOL METADC_ExtTextOut( HDC hdc, INT x, INT y, UINT flags, const RECT *re
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_PaintRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN;
extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom,
INT xstart, INT ystart, INT xend, INT yend ) DECLSPEC_HIDDEN;
extern BOOL METADC_PolyPolygon( HDC hdc, const POINT *points, const INT *counts,
@@ -80,6 +81,7 @@ extern BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const
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_PaintRgn( DC_ATTR *dc_attr, HRGN hrgn ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_PolyBezier( DC_ATTR *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_PolyBezierTo( DC_ATTR *dc_attr, const POINT *points, DWORD count ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_PolyDraw( DC_ATTR *dc_attr, const POINT *points, const BYTE *types,
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index 956326b7c14..7ba1aecdca1 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -397,6 +397,21 @@ BOOL WINAPI FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush )
return NtGdiFillRgn( hdc, hrgn, hbrush );
}
+/***********************************************************************
+ * PaintRgn (GDI32.@)
+ */
+BOOL WINAPI PaintRgn( HDC hdc, HRGN hrgn )
+{
+ DC_ATTR *dc_attr;
+
+ TRACE( "%p, %p\n", hdc, hrgn );
+
+ if (is_meta_dc( hdc )) return METADC_PaintRgn( hdc, hrgn );
+ if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+ if (dc_attr->emf && !EMFDC_PaintRgn( dc_attr, hrgn )) return FALSE;
+ return NtGdiFillRgn( hdc, hrgn, GetCurrentObject( hdc, OBJ_BRUSH ));
+}
+
/***********************************************************************
* ExtTextOutW (GDI32.@)
*/
diff --git a/dlls/gdi32/mfdrv/graphics.c b/dlls/gdi32/mfdrv/graphics.c
index 56f93aa860d..dcfc481119f 100644
--- a/dlls/gdi32/mfdrv/graphics.c
+++ b/dlls/gdi32/mfdrv/graphics.c
@@ -354,15 +354,17 @@ static INT16 MFDRV_CreateRegion(PHYSDEV dev, HRGN hrgn)
/**********************************************************************
- * MFDRV_PaintRgn
+ * METADC_PaintRgn
*/
-BOOL CDECL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn )
+BOOL METADC_PaintRgn( HDC hdc, HRGN hrgn )
{
+ METAFILEDRV_PDEVICE *mf;
INT16 index;
- index = MFDRV_CreateRegion( dev, hrgn );
+ if (!(mf = get_metadc_ptr( hdc ))) return FALSE;
+ index = MFDRV_CreateRegion( &mf->dev, hrgn );
if(index == -1)
return FALSE;
- return MFDRV_MetaParam1( dev, META_PAINTREGION, index );
+ return MFDRV_MetaParam1( &mf->dev, META_PAINTREGION, index );
}
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 5d32c5563de..c40f892a9a1 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -165,7 +165,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs =
MFDRV_OffsetClipRgn, /* pOffsetClipRgn */
MFDRV_OffsetViewportOrgEx, /* pOffsetViewportOrgEx */
MFDRV_OffsetWindowOrgEx, /* pOffsetWindowOrgEx */
- MFDRV_PaintRgn, /* pPaintRgn */
+ NULL, /* pPaintRgn */
MFDRV_PatBlt, /* pPatBlt */
NULL, /* pPie */
MFDRV_PolyBezier, /* pPolyBezier */
diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h
index 9809f3e2a11..09c9b793e43 100644
--- a/dlls/gdi32/mfdrv/metafiledrv.h
+++ b/dlls/gdi32/mfdrv/metafiledrv.h
@@ -91,7 +91,6 @@ extern BOOL CDECL MFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_OffsetViewportOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_OffsetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
-extern BOOL CDECL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_PolyBezier( PHYSDEV dev, const POINT* pt, DWORD count ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_PolyBezierTo( PHYSDEV dev, const POINT* pt, DWORD count ) DECLSPEC_HIDDEN;
@@ -127,7 +126,6 @@ extern BOOL CDECL MFDRV_SetWindowExtEx( PHYSDEV dev, INT x, INT y, SIZE *size )
extern BOOL CDECL MFDRV_SetWindowOrgEx( PHYSDEV dev, INT x, INT y, POINT *pt ) DECLSPEC_HIDDEN;
extern BOOL CDECL MFDRV_StretchBlt( PHYSDEV devDst, struct bitblt_coords *dst,
PHYSDEV devSrc, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
-extern BOOL CDECL MFDRV_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN;
extern INT CDECL MFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest, DWORD cx,
DWORD cy, INT xSrc, INT ySrc,
UINT startscan, UINT lines, LPCVOID bits,
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index eb537a44574..6ff24f622c7 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -76,7 +76,8 @@ BOOL CDECL nulldrv_FillRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush )
if ((prev = NtGdiSelectBrush( dev->hdc, brush )))
{
- ret = PaintRgn( dev->hdc, rgn );
+ PHYSDEV physdev = GET_DC_PHYSDEV( get_physdev_dc( dev ), pPaintRgn );
+ ret = physdev->funcs->pPaintRgn( physdev, rgn );
NtGdiSelectBrush( dev->hdc, prev );
}
return ret;
@@ -98,10 +99,8 @@ BOOL CDECL nulldrv_FrameRgn( PHYSDEV dev, HRGN rgn, HBRUSH brush, INT width, INT
BOOL CDECL nulldrv_InvertRgn( PHYSDEV dev, HRGN rgn )
{
- HBRUSH prev_brush = NtGdiSelectBrush( dev->hdc, GetStockObject(BLACK_BRUSH) );
INT prev_rop = SetROP2( dev->hdc, R2_NOT );
- BOOL ret = PaintRgn( dev->hdc, rgn );
- NtGdiSelectBrush( dev->hdc, prev_brush );
+ BOOL ret = NtGdiFillRgn( dev->hdc, rgn, GetStockObject(BLACK_BRUSH) );
SetROP2( dev->hdc, prev_rop );
return ret;
}
@@ -473,26 +472,6 @@ BOOL WINAPI NtGdiSwapBuffers( HDC hdc )
}
-/***********************************************************************
- * PaintRgn (GDI32.@)
- */
-BOOL WINAPI PaintRgn( HDC hdc, HRGN hrgn )
-{
- PHYSDEV physdev;
- BOOL ret;
- DC * dc = get_dc_ptr( hdc );
-
- TRACE( "%p, %p\n", hdc, hrgn );
-
- if (!dc) return FALSE;
- update_dc( dc );
- physdev = GET_DC_PHYSDEV( dc, pPaintRgn );
- ret = physdev->funcs->pPaintRgn( physdev, hrgn );
- release_dc_ptr( dc );
- return ret;
-}
-
-
/***********************************************************************
* NtGdiFillRgn (win32u.@)
*/
More information about the wine-cvs
mailing list