Jacek Caban : gdi32: Use NtGdiPolyDraw for PolyDraw implementation.
Alexandre Julliard
julliard at winehq.org
Fri Jul 23 18:08:00 CDT 2021
Module: wine
Branch: master
Commit: 11f09c2d74d0eaeeaba5f93544166f87881b7f40
URL: https://source.winehq.org/git/wine.git/?a=commit;h=11f09c2d74d0eaeeaba5f93544166f87881b7f40
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jul 23 10:48:48 2021 +0200
gdi32: Use NtGdiPolyDraw for PolyDraw 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/dc.c | 14 +-------------
dlls/gdi32/enhmfdrv/graphics.c | 22 ++++++++++++++++------
dlls/gdi32/gdi_private.h | 2 ++
dlls/gdi32/gdidc.c | 14 ++++++++++++++
dlls/gdi32/painting.c | 13 +++++--------
dlls/gdi32/tests/metafile.c | 9 +++++++++
6 files changed, 47 insertions(+), 27 deletions(-)
diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c
index b2b6bb4866e..7af63eed23b 100644
--- a/dlls/gdi32/enhmfdrv/dc.c
+++ b/dlls/gdi32/enhmfdrv/dc.c
@@ -671,18 +671,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_PolyDraw
- */
-static BOOL CDECL emfpathdrv_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types, DWORD count )
-{
- PHYSDEV emfdev = get_emfdev( dev );
- PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyDraw );
-
- return (emfdev->funcs->pPolyDraw( emfdev, pts, types, count ) &&
- next->funcs->pPolyDraw( next, pts, types, count ));
-}
-
static const struct gdi_dc_funcs emfpath_driver =
{
@@ -757,7 +745,7 @@ static const struct gdi_dc_funcs emfpath_driver =
NULL, /* pPie */
NULL, /* pPolyBezier */
NULL, /* pPolyBezierTo */
- emfpathdrv_PolyDraw, /* pPolyDraw */
+ NULL, /* pPolyDraw */
NULL, /* pPolyPolygon */
NULL, /* pPolyPolyline */
NULL, /* pPolylineTo */
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index 80cffdbdebf..7c800148cf8 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -741,11 +741,11 @@ BOOL CDECL EMFDRV_PolyPolygon( PHYSDEV dev, const POINT* pt, const INT* counts,
}
/**********************************************************************
- * EMFDRV_PolyDraw
+ * EMFDC_PolyDraw
*/
-BOOL CDECL EMFDRV_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types, DWORD count )
+BOOL EMFDC_PolyDraw( DC_ATTR *dc_attr, const POINT *pts, const BYTE *types, DWORD count )
{
- EMFDRV_PDEVICE *physDev = get_emf_physdev( dev );
+ EMFDRV_PDEVICE *emf = dc_attr->emf;
EMRPOLYDRAW *emr;
BOOL ret;
BYTE *types_dest;
@@ -765,18 +765,28 @@ BOOL CDECL EMFDRV_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types, DW
memcpy( types_dest, types, count );
if (count & 3) memset( types_dest + count, 0, 4 - (count & 3) );
- if (!physDev->path)
+ if (!emf->path)
get_points_bounds( &emr->rclBounds, pts, count, 0 );
else
emr->rclBounds = empty_bounds;
- ret = EMFDRV_WriteRecord( dev, &emr->emr );
- if (ret && !physDev->path) EMFDRV_UpdateBBox( dev, &emr->rclBounds );
+ ret = EMFDRV_WriteRecord( &emf->dev, &emr->emr );
+ if (ret && !emf->path) EMFDRV_UpdateBBox( &emf->dev, &emr->rclBounds );
HeapFree( GetProcessHeap(), 0, emr );
return ret;
}
+/**********************************************************************
+ * EMFDRV_PolyDraw
+ */
+BOOL CDECL EMFDRV_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE *types, DWORD count )
+{
+ /* FIXME: update bounding rect */
+ return TRUE;
+}
+
+
/**********************************************************************
* EMFDRV_ExtFloodFill
*/
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index fd36712dfbc..f7b04be18dc 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -71,6 +71,8 @@ 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;
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,
+ DWORD count ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_PolyPolyline( DC_ATTR *dc_attr, const POINT *points, const DWORD *counts,
DWORD polys ) DECLSPEC_HIDDEN;
extern BOOL EMFDC_PolyPolygon( DC_ATTR *dc_attr, const POINT *points, const INT *counts,
diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c
index c51892d3a9e..c6a8cbd567f 100644
--- a/dlls/gdi32/gdidc.c
+++ b/dlls/gdi32/gdidc.c
@@ -337,3 +337,17 @@ BOOL WINAPI PolylineTo( HDC hdc, const POINT *points, DWORD count )
if (dc_attr->emf && !EMFDC_PolylineTo( dc_attr, points, count )) return FALSE;
return NtGdiPolyPolyDraw( hdc, points, &count, 1, NtGdiPolylineTo );
}
+
+/***********************************************************************
+ * PolyDraw (GDI32.@)
+ */
+BOOL WINAPI PolyDraw( HDC hdc, const POINT *points, const BYTE *types, DWORD count )
+{
+ DC_ATTR *dc_attr;
+
+ TRACE( "%p, %p, %p, %u\n", hdc, points, types, count );
+
+ if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
+ if (dc_attr->emf && !EMFDC_PolyDraw( dc_attr, points, types, count )) return FALSE;
+ return NtGdiPolyDraw( hdc, points, types, count );
+}
diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c
index 9c7081296df..f9fa18c4de0 100644
--- a/dlls/gdi32/painting.c
+++ b/dlls/gdi32/painting.c
@@ -699,24 +699,21 @@ BOOL WINAPI NtGdiAngleArc( HDC hdc, INT x, INT y, DWORD dwRadius, FLOAT eStartAn
}
/***********************************************************************
- * PolyDraw (GDI32.@)
+ * NtGdiPolyDraw (win32u.@)
*/
-BOOL WINAPI PolyDraw(HDC hdc, const POINT *lppt, const BYTE *lpbTypes,
- DWORD cCount)
+BOOL WINAPI NtGdiPolyDraw( HDC hdc, const POINT *points, const BYTE *types, DWORD count )
{
DC *dc = get_dc_ptr( hdc );
PHYSDEV physdev;
BOOL result;
- TRACE( "%p, %p, %p, %u\n", hdc, lppt, lpbTypes, cCount );
-
if(!dc) return FALSE;
update_dc( dc );
physdev = GET_DC_PHYSDEV( dc, pPolyDraw );
- result = physdev->funcs->pPolyDraw( physdev, lppt, lpbTypes, cCount );
- if (result && cCount)
- dc->attr->cur_pos = lppt[cCount - 1];
+ result = physdev->funcs->pPolyDraw( physdev, points, types, count );
+ if (result && count)
+ dc->attr->cur_pos = points[count - 1];
release_dc_ptr( dc );
return result;
diff --git a/dlls/gdi32/tests/metafile.c b/dlls/gdi32/tests/metafile.c
index 4f72079a615..d9d43b80fc4 100644
--- a/dlls/gdi32/tests/metafile.c
+++ b/dlls/gdi32/tests/metafile.c
@@ -3324,6 +3324,9 @@ static void test_mf_Graphics(void)
INT type;
BOOL ret;
+ static const POINT points[] = { {1, 1}, {2, 2} };
+ static const BYTE types[] = { PT_MOVETO, PT_LINETO };
+
hdcMetafile = CreateMetaFileA(NULL);
ok(hdcMetafile != 0, "CreateMetaFileA(NULL) error %d\n", GetLastError());
@@ -3344,6 +3347,12 @@ static void test_mf_Graphics(void)
ret = ArcTo(hdcMetafile, 1, 2, 30, 40, 11, 12, 23, 24 );
ok( !ret, "ArcTo succeeded\n" );
+ SetLastError(0xdeadbeef);
+ ret = PolyDraw(hdcMetafile, points, types, ARRAY_SIZE(points));
+ ok(!ret, "PolyDraw succeeded\n");
+ todo_wine
+ ok(GetLastError() == 0xdeadbeef, "GetLastError() = %u\n", GetLastError());
+
hMetafile = CloseMetaFile(hdcMetafile);
ok(hMetafile != 0, "CloseMetaFile error %d\n", GetLastError());
type = GetObjectType(hdcMetafile);
More information about the wine-cvs
mailing list