diff --git a/dlls/gdi32/enhmfdrv/dc.c b/dlls/gdi32/enhmfdrv/dc.c index c4037e5fa99..313535de973 100644 --- a/dlls/gdi32/enhmfdrv/dc.c +++ b/dlls/gdi32/enhmfdrv/dc.c @@ -707,18 +707,6 @@ static BOOL CDECL emfpathdrv_PolyDraw( PHYSDEV dev, const POINT *pts, const BYTE next->funcs->pPolyDraw( next, pts, types, count )); } -/*********************************************************************** - * emfpathdrv_PolyPolyline - */ -static BOOL CDECL emfpathdrv_PolyPolyline( PHYSDEV dev, const POINT *pts, const DWORD *counts, DWORD polylines ) -{ - PHYSDEV emfdev = get_emfdev( dev ); - PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyPolyline ); - - return (emfdev->funcs->pPolyPolyline( emfdev, pts, counts, polylines ) && - next->funcs->pPolyPolyline( next, pts, counts, polylines )); -} - /*********************************************************************** * emfpathdrv_Polyline */ @@ -819,7 +807,7 @@ static const struct gdi_dc_funcs emfpath_driver = emfpathdrv_PolyBezierTo, /* pPolyBezierTo */ emfpathdrv_PolyDraw, /* pPolyDraw */ NULL, /* pPolyPolygon */ - emfpathdrv_PolyPolyline, /* pPolyPolyline */ + NULL, /* pPolyPolyline */ NULL, /* pPolygon */ emfpathdrv_Polyline, /* pPolyline */ emfpathdrv_PolylineTo, /* pPolylineTo */ diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c index 6d15946d2fb..852dd9de68f 100644 --- a/dlls/gdi32/enhmfdrv/graphics.c +++ b/dlls/gdi32/enhmfdrv/graphics.c @@ -626,15 +626,13 @@ BOOL CDECL EMFDRV_PolyBezierTo( PHYSDEV dev, const POINT *pts, DWORD count ) /********************************************************************** - * EMFDRV_PolyPolylinegon + * EMFDC_PolyPolylinegon * * Helper for EMFDRV_PolyPoly{line|gon} */ -static BOOL -EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT polys, - DWORD iType) +static BOOL EMFDC_PolyPolylinegon( EMFDRV_PDEVICE *emf, const POINT *pt, const INT *counts, + UINT polys, DWORD type) { - EMFDRV_PDEVICE *physDev = get_emf_physdev( dev ); EMRPOLYPOLYLINE *emr; DWORD cptl = 0, poly, size; BOOL ret, use_small_emr, bounds_valid = TRUE; @@ -654,11 +652,11 @@ EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT po emr = HeapAlloc( GetProcessHeap(), 0, size ); - emr->emr.iType = iType; + emr->emr.iType = type; if(use_small_emr) emr->emr.iType += EMR_POLYPOLYLINE16 - EMR_POLYPOLYLINE; emr->emr.nSize = size; - if(bounds_valid && !physDev->path) + if(bounds_valid && !emf->path) get_points_bounds( &emr->rclBounds, pt, cptl, 0 ); else emr->rclBounds = empty_bounds; @@ -671,25 +669,33 @@ EMFDRV_PolyPolylinegon( PHYSDEV dev, const POINT* pt, const INT* counts, UINT po store_points( (POINTL *)(emr->aPolyCounts + polys), pt, cptl, use_small_emr ); } - ret = EMFDRV_WriteRecord( dev, &emr->emr ); + ret = EMFDRV_WriteRecord( &emf->dev, &emr->emr ); if(ret && !bounds_valid) { ret = FALSE; SetLastError( ERROR_INVALID_PARAMETER ); } - if(ret && !physDev->path) - EMFDRV_UpdateBBox( dev, &emr->rclBounds ); + if(ret && !emf->path) + EMFDRV_UpdateBBox( &emf->dev, &emr->rclBounds ); HeapFree( GetProcessHeap(), 0, emr ); return ret; } /********************************************************************** - * EMFDRV_PolyPolyline + * EMFDC_PolyPolyline */ -BOOL CDECL EMFDRV_PolyPolyline(PHYSDEV dev, const POINT* pt, const DWORD* counts, DWORD polys) +BOOL EMFDC_PolyPolyline( DC_ATTR *dc_attr, const POINT *pt, const DWORD *counts, DWORD polys) { - return EMFDRV_PolyPolylinegon( dev, pt, (const INT *)counts, polys, - EMR_POLYPOLYLINE ); + return EMFDC_PolyPolylinegon( dc_attr->emf, pt, (const INT *)counts, polys, EMR_POLYPOLYLINE ); +} + +/********************************************************************** + * EMFDRV_PolyPoline + */ +BOOL CDECL EMFDRV_PolyPolyline( PHYSDEV dev, const POINT *pt, const DWORD* counts, UINT polys ) +{ + /* FIXME: update bounding rect */ + return TRUE; } /********************************************************************** @@ -697,7 +703,7 @@ BOOL CDECL EMFDRV_PolyPolyline(PHYSDEV dev, const POINT* pt, const DWORD* counts */ BOOL EMFDC_PolyPolygon( DC_ATTR *dc_attr, const POINT *pt, const INT *counts, UINT polys ) { - return EMFDRV_PolyPolylinegon( dc_attr->emf, pt, counts, polys, EMR_POLYPOLYGON ); + return EMFDC_PolyPolylinegon( dc_attr->emf, pt, counts, polys, EMR_POLYPOLYGON ); } /********************************************************************** diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h index 645e78805fd..424d432f0d0 100644 --- a/dlls/gdi32/gdi_private.h +++ b/dlls/gdi32/gdi_private.h @@ -68,6 +68,8 @@ extern BOOL EMFDC_Ellipse( DC_ATTR *dc_attr, INT left, INT top, INT right, INT bottom ) 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_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, UINT polys ) DECLSPEC_HIDDEN; extern BOOL EMFDC_Polygon( DC_ATTR *dc_attr, const POINT *points, INT count ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/gdidc.c b/dlls/gdi32/gdidc.c index d224a59941a..89405358194 100644 --- a/dlls/gdi32/gdidc.c +++ b/dlls/gdi32/gdidc.c @@ -266,3 +266,17 @@ BOOL WINAPI PolyPolygon( HDC hdc, const POINT *points, const INT *counts, UINT p if (dc_attr->emf && !EMFDC_PolyPolygon( dc_attr, points, counts, polygons )) return FALSE; return NtGdiPolyPolyDraw( hdc, points, (const UINT *)counts, polygons, NtGdiPolyPolygon ); } + +/********************************************************************** + * PolyPolyline (GDI32.@) + */ +BOOL WINAPI PolyPolyline( HDC hdc, const POINT *points, const DWORD *counts, DWORD polylines ) +{ + DC_ATTR *dc_attr; + + TRACE( "%p, %p, %p, %u\n", hdc, points, counts, polylines ); + + if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; + if (dc_attr->emf && !EMFDC_PolyPolyline( dc_attr, points, counts, polylines )) return FALSE; + return NtGdiPolyPolyDraw( hdc, points, counts, polylines, NtGdiPolyPolyline ); +} diff --git a/dlls/gdi32/painting.c b/dlls/gdi32/painting.c index f8544b209d8..5be668cd282 100644 --- a/dlls/gdi32/painting.c +++ b/dlls/gdi32/painting.c @@ -632,6 +632,12 @@ ULONG WINAPI NtGdiPolyPolyDraw( HDC hdc, const POINT *points, const UINT *counts physdev = GET_DC_PHYSDEV( dc, pPolyPolygon ); ret = physdev->funcs->pPolyPolygon( physdev, points, (const INT *)counts, count ); break; + + case NtGdiPolyPolyline: + physdev = GET_DC_PHYSDEV( dc, pPolyPolyline ); + ret = physdev->funcs->pPolyPolyline( physdev, points, counts, count ); + break; + default: WARN( "invalid function %u\n", function ); ret = FALSE; @@ -642,26 +648,6 @@ ULONG WINAPI NtGdiPolyPolyDraw( HDC hdc, const POINT *points, const UINT *counts return ret; } -/********************************************************************** - * PolyPolyline (GDI32.@) - */ -BOOL WINAPI PolyPolyline( HDC hdc, const POINT* pt, const DWORD* counts, - DWORD polylines ) -{ - PHYSDEV physdev; - BOOL ret; - DC * dc = get_dc_ptr( hdc ); - - TRACE( "%p, %p, %p, %u\n", hdc, pt, counts, polylines ); - - if (!dc) return FALSE; - update_dc( dc ); - physdev = GET_DC_PHYSDEV( dc, pPolyPolyline ); - ret = physdev->funcs->pPolyPolyline( physdev, pt, counts, polylines ); - release_dc_ptr( dc ); - return ret; -} - /********************************************************************** * ExtFloodFill (GDI32.@) */