From 4fc7a1df1bfb8c43dc07e264e23c37cedd169e55 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Tue, 20 Jul 2021 09:19:05 +0200 Subject: [PATCH] gdi32: Handle EMFs directly in MoveToEx. Signed-off-by: Jacek Caban Signed-off-by: Huw Davies Signed-off-by: Alexandre Julliard --- dlls/gdi32/enhmfdrv/dc.c | 13 +------------ dlls/gdi32/enhmfdrv/enhmetafiledrv.h | 1 - dlls/gdi32/enhmfdrv/graphics.c | 7 ++++--- dlls/gdi32/enhmfdrv/init.c | 2 +- dlls/gdi32/gdi_private.h | 1 + dlls/gdi32/gdidc.c | 4 ++++ 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index 79c3032daa6..d0d9d2f14fe 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -734,17 +734,6 @@ static BOOL CDECL emfpathdrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, next->funcs->pExtTextOut( next, x, y, flags, rect, str, count, dx )); } -/*********************************************************************** - * emfpathdrv_MoveTo - */ -static BOOL CDECL emfpathdrv_MoveTo( PHYSDEV dev, INT x, INT y ) -{ - PHYSDEV emfdev = get_emfdev( dev ); - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pMoveTo ); - - return (emfdev->funcs->pMoveTo( emfdev, x, y ) && next->funcs->pMoveTo( next, x, y )); -} - /*********************************************************************** * emfpathdrv_Pie */ @@ -944,7 +933,7 @@ static const struct gdi_dc_funcs emfpath_driver = NULL, /* pInvertRgn */ NULL, /* pLineTo */ NULL, /* pModifyWorldTransform */ - emfpathdrv_MoveTo, /* pMoveTo */ + NULL, /* pMoveTo */ NULL, /* pOffsetClipRgn */ NULL, /* pOffsetViewportOrg */ NULL, /* pOffsetWindowOrg */ diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h index 1a90f70604f..9f9799a54da 100644 --- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h +++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h @@ -92,7 +92,6 @@ extern INT CDECL EMFDRV_IntersectClipRect( PHYSDEV dev, INT left, INT top, 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 BOOL CDECL EMFDRV_MoveTo( PHYSDEV dev, INT x, INT y ) 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; diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c index 8d6445779b9..3c8c8b3bd07 100644 --- a/dlls/gdi32/enhmfdrv/graphics.c +++ b/dlls/gdi32/enhmfdrv/graphics.c @@ -118,10 +118,11 @@ static BOOL emfdrv_stroke_and_fill_path( PHYSDEV dev, INT type ) } /********************************************************************** - * EMFDRV_MoveTo + * EMFDC_MoveTo */ -BOOL CDECL EMFDRV_MoveTo(PHYSDEV dev, INT x, INT y) +BOOL EMFDC_MoveTo( DC_ATTR *dc_attr, INT x, INT y ) { + EMFDRV_PDEVICE *emf = dc_attr->emf; EMRMOVETOEX emr; emr.emr.iType = EMR_MOVETOEX; @@ -129,7 +130,7 @@ BOOL CDECL EMFDRV_MoveTo(PHYSDEV dev, INT x, INT y) emr.ptl.x = x; emr.ptl.y = y; - return EMFDRV_WriteRecord( dev, &emr.emr ); + return EMFDRV_WriteRecord( &emf->dev, &emr.emr ); } /*********************************************************************** diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c index 62e35fe4029..c941e095752 100644 --- a/dlls/gdi32/enhmfdrv/init.c +++ b/dlls/gdi32/enhmfdrv/init.c @@ -98,7 +98,7 @@ static const struct gdi_dc_funcs emfdrv_driver = EMFDRV_InvertRgn, /* pInvertRgn */ EMFDRV_LineTo, /* pLineTo */ EMFDRV_ModifyWorldTransform, /* pModifyWorldTransform */ - EMFDRV_MoveTo, /* pMoveTo */ + NULL, /* pMoveTo */ EMFDRV_OffsetClipRgn, /* pOffsetClipRgn */ EMFDRV_OffsetViewportOrgEx, /* pOffsetViewportOrgEx */ EMFDRV_OffsetWindowOrgEx, /* pOffsetWindowOrgEx */ diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index bb4504f4934..7f3eeff566c 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -53,5 +53,6 @@ extern BOOL METADC_Pie( HDC hdc, INT left, INT top, INT right, INT bottom, /* enhanced metafiles */ 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; #endif /* __WINE_GDI_PRIVATE_H */ diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index 54526a0876c..57163423e13 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -68,9 +68,13 @@ BOOL WINAPI LineTo( HDC hdc, INT x, INT y ) */ BOOL WINAPI MoveToEx( HDC hdc, INT x, INT y, POINT *pt ) { + DC_ATTR *dc_attr; + TRACE( "%p, (%d, %d), %p\n", hdc, x, y, pt ); if (is_meta_dc( hdc )) return METADC_MoveTo( hdc, x, y ); + if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; + if (dc_attr->emf && !EMFDC_MoveTo( dc_attr, x, y )) return FALSE; return NtGdiMoveTo( hdc, x, y, pt ); }