From 112fe018bf84769f089f459dd7cf5c23c931177c Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Wed, 4 Aug 2021 11:20:53 +0200 Subject: [PATCH] gdi32: Use NtGdiOffsetClipRgn for OffsetClipRgn implementation. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/clipping.c | 33 +++++++++++++-------------------- dlls/gdi32/enhmfdrv/dc.c | 6 ++---- dlls/gdi32/enhmfdrv/enhmetafiledrv.h | 1 - dlls/gdi32/enhmfdrv/init.c | 2 +- dlls/gdi32/gdi_private.h | 2 ++ dlls/gdi32/gdidc.c | 13 +++++++++++++ dlls/gdi32/mfdrv/dc.c | 4 ++-- dlls/gdi32/mfdrv/init.c | 2 +- dlls/gdi32/mfdrv/metafiledrv.h | 1 - 9 files changed, 34 insertions(+), 30 deletions(-) diff --git a/dlls/gdi32/clipping.c b/dlls/gdi32/clipping.c index 30ce88fe41c..9e03635a103 100644 --- a/dlls/gdi32/clipping.c +++ b/dlls/gdi32/clipping.c @@ -211,18 +211,7 @@ INT CDECL nulldrv_IntersectClipRect( PHYSDEV dev, INT left, INT top, INT right, INT CDECL nulldrv_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) { - DC *dc = get_nulldrv_dc( dev ); - INT ret = NULLREGION; - - if (dc->hClipRgn) - { - x = MulDiv( x, dc->attr->vport_ext.cx, dc->attr->wnd_ext.cx ); - y = MulDiv( y, dc->attr->vport_ext.cy, dc->attr->wnd_ext.cy ); - if (dc->attr->layout & LAYOUT_RTL) x = -x; - ret = NtGdiOffsetRgn( dc->hClipRgn, x, y ); - update_dc_clipping( dc ); - } - return ret; + return ERROR; } @@ -283,20 +272,24 @@ void CDECL __wine_set_visible_region( HDC hdc, HRGN hrgn, const RECT *vis_rect, /*********************************************************************** - * OffsetClipRgn (GDI32.@) + * NtGdiOffsetClipRgn (win32u.@) */ -INT WINAPI OffsetClipRgn( HDC hdc, INT x, INT y ) +INT WINAPI NtGdiOffsetClipRgn( HDC hdc, INT x, INT y ) { - PHYSDEV physdev; - INT ret; + INT ret = NULLREGION; DC *dc = get_dc_ptr( hdc ); - TRACE("%p %d,%d\n", hdc, x, y ); - if (!dc) return ERROR; update_dc( dc ); - physdev = GET_DC_PHYSDEV( dc, pOffsetClipRgn ); - ret = physdev->funcs->pOffsetClipRgn( physdev, x, y ); + + if (dc->hClipRgn) + { + x = MulDiv( x, dc->attr->vport_ext.cx, dc->attr->wnd_ext.cx ); + y = MulDiv( y, dc->attr->vport_ext.cy, dc->attr->wnd_ext.cy ); + if (dc->attr->layout & LAYOUT_RTL) x = -x; + ret = NtGdiOffsetRgn( dc->hClipRgn, x, y ); + 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 68f8e1445cb..4b51a140c27 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -174,17 +174,15 @@ BOOL EMFDC_IntersectClipRect( DC_ATTR *dc_attr, INT left, INT top, INT right, IN return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr ); } -INT CDECL EMFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) +BOOL EMFDC_OffsetClipRgn( DC_ATTR *dc_attr, INT x, INT y ) { - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pOffsetClipRgn ); EMROFFSETCLIPRGN emr; emr.emr.iType = EMR_OFFSETCLIPRGN; emr.emr.nSize = sizeof(emr); emr.ptlOffset.x = x; emr.ptlOffset.y = y; - if (!EMFDRV_WriteRecord( dev, &emr.emr )) return ERROR; - return next->funcs->pOffsetClipRgn( next, x, y ); + return EMFDRV_WriteRecord( dc_attr->emf, &emr.emr ); } INT CDECL EMFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h index 9986d44dd85..d0d7ad14878 100644 --- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h +++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h @@ -85,7 +85,6 @@ extern BOOL CDECL EMFDRV_GradientFill( PHYSDEV dev, TRIVERTEX *vert_array, U extern BOOL CDECL EMFDRV_InvertRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_LineTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL CDECL EMFDRV_ModifyWorldTransform( PHYSDEV dev, const XFORM *xform, DWORD mode ) DECLSPEC_HIDDEN; -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_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 79a505c7701..80326fe0d04 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -99,7 +99,7 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_LineTo, /* pLineTo */ EMFDRV_ModifyWorldTransform, /* pModifyWorldTransform */ NULL, /* pMoveTo */ - EMFDRV_OffsetClipRgn, /* pOffsetClipRgn */ + NULL, /* pOffsetClipRgn */ EMFDRV_OffsetViewportOrgEx, /* pOffsetViewportOrgEx */ EMFDRV_OffsetWindowOrgEx, /* pOffsetWindowOrgEx */ NULL, /* pPaintRgn */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index cc7dbec910f..58ea438a582 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -59,6 +59,7 @@ extern BOOL METADC_IntersectClipRect( HDC hdc, INT left, INT top, INT right, extern BOOL METADC_InvertRgn( HDC hdc, HRGN hrgn ) 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_OffsetClipRgn( HDC hdc, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL METADC_PaintRgn( HDC hdc, HRGN hrgn ) DECLSPEC_HIDDEN; extern BOOL METADC_PatBlt( HDC hdc, INT left, INT top, INT width, INT height, DWORD rop ); extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom, @@ -105,6 +106,7 @@ extern BOOL EMFDC_IntersectClipRect( DC_ATTR *dc_attr, INT left, INT top, INT ri extern BOOL EMFDC_InvertRgn( DC_ATTR *dc_attr, HRGN hrgn ) 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_OffsetClipRgn( 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_PatBlt( DC_ATTR *dc_attr, INT left, INT top, INT width, INT height, DWORD rop ); 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 72990ef18e3..c1743498934 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -1063,6 +1063,19 @@ INT WINAPI IntersectClipRect( HDC hdc, INT left, INT top, INT right, INT bottom } /*********************************************************************** + * OffsetClipRgn (GDI32.@) + */ +INT WINAPI OffsetClipRgn( HDC hdc, INT x, INT y ) +{ + DC_ATTR *dc_attr; + + if (is_meta_dc( hdc )) return METADC_OffsetClipRgn( hdc, x, y ); + if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; + if (dc_attr->emf && !EMFDC_OffsetClipRgn( dc_attr, x, y )) return FALSE; + return NtGdiOffsetClipRgn( hdc, x, y ); +} + +/*********************************************************************** * GdiSetPixelFormat (GDI32.@) */ BOOL WINAPI GdiSetPixelFormat( HDC hdc, INT format, const PIXELFORMATDESCRIPTOR *descr ) diff --git a/dlls/gdi32/mfdrv/dc.c b/dlls/gdi32/mfdrv/dc.c index 93924c98216..fde7bacfd11 100644 --- a/dlls/gdi32/mfdrv/dc.c +++ b/dlls/gdi32/mfdrv/dc.c @@ -80,9 +80,9 @@ INT CDECL MFDRV_ExcludeClipRect( PHYSDEV dev, INT left, INT top, INT right, INT return MFDRV_MetaParam4( dev, META_EXCLUDECLIPRECT, left, top, right, bottom ); } -INT CDECL MFDRV_OffsetClipRgn( PHYSDEV dev, INT x, INT y ) +BOOL METADC_OffsetClipRgn( HDC hdc, INT x, INT y ) { - return MFDRV_MetaParam2( dev, META_OFFSETCLIPRGN, x, y ); + return metadc_param2( hdc, META_OFFSETCLIPRGN, x, y ); } DWORD CDECL MFDRV_SetLayout( PHYSDEV dev, DWORD layout ) diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c index 4c225c68e53..01e1ee92c98 100644 --- a/dlls/gdi32/mfdrv/init.c +++ b/dlls/gdi32/mfdrv/init.c @@ -164,7 +164,7 @@ static const struct gdi_dc_funcs MFDRV_Funcs = NULL, /* pLineTo */ NULL, /* pModifyWorldTransform */ NULL, /* pMoveTo */ - MFDRV_OffsetClipRgn, /* pOffsetClipRgn */ + NULL, /* pOffsetClipRgn */ MFDRV_OffsetViewportOrgEx, /* pOffsetViewportOrgEx */ MFDRV_OffsetWindowOrgEx, /* pOffsetWindowOrgEx */ NULL, /* pPaintRgn */ diff --git a/dlls/gdi32/mfdrv/metafiledrv.h b/dlls/gdi32/mfdrv/metafiledrv.h index ec3a0ab7b6d..5b5d17859fa 100644 --- a/dlls/gdi32/mfdrv/metafiledrv.h +++ b/dlls/gdi32/mfdrv/metafiledrv.h @@ -88,7 +88,6 @@ extern INT CDECL MFDRV_ExtSelectClipRgn( PHYSDEV dev, HRGN hrgn, INT mode ) DEC extern BOOL CDECL MFDRV_FillPath( PHYSDEV dev ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_FillRgn( PHYSDEV dev, HRGN hrgn, HBRUSH hbrush ) DECLSPEC_HIDDEN; extern BOOL CDECL MFDRV_FlattenPath( PHYSDEV dev ) 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_PolyBezier( PHYSDEV dev, const POINT* pt, DWORD count ) DECLSPEC_HIDDEN; -- 2.11.4.GIT