From c6f6c3f727556734905a5bbf4fe1b59079e37bf5 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Fri, 19 Aug 2011 16:26:19 +0100 Subject: [PATCH] gdi32: Implement Polyline and PolyPolyline in the dib driver. --- dlls/gdi32/dibdrv/dc.c | 4 +-- dlls/gdi32/dibdrv/dibdrv.h | 3 ++ dlls/gdi32/dibdrv/graphics.c | 55 ++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/dlls/gdi32/dibdrv/dc.c b/dlls/gdi32/dibdrv/dc.c index 64769beb6e6..03e3f65afeb 100644 --- a/dlls/gdi32/dibdrv/dc.c +++ b/dlls/gdi32/dibdrv/dc.c @@ -773,9 +773,9 @@ const DC_FUNCTIONS dib_driver = NULL, /* pPolyBezierTo */ NULL, /* pPolyDraw */ NULL, /* pPolyPolygon */ - NULL, /* pPolyPolyline */ + dibdrv_PolyPolyline, /* pPolyPolyline */ NULL, /* pPolygon */ - NULL, /* pPolyline */ + dibdrv_Polyline, /* pPolyline */ NULL, /* pPolylineTo */ dibdrv_PutImage, /* pPutImage */ NULL, /* pRealizeDefaultPalette */ diff --git a/dlls/gdi32/dibdrv/dibdrv.h b/dlls/gdi32/dibdrv/dibdrv.h index bab52cdd997..760c02ec9cc 100644 --- a/dlls/gdi32/dibdrv/dibdrv.h +++ b/dlls/gdi32/dibdrv/dibdrv.h @@ -21,6 +21,9 @@ extern BOOL dibdrv_LineTo( PHYSDEV dev, INT x, INT y ) DECLSPEC_HIDDEN; extern BOOL dibdrv_PatBlt( PHYSDEV dev, struct bitblt_coords *dst, DWORD rop ) DECLSPEC_HIDDEN; extern BOOL dibdrv_PaintRgn( PHYSDEV dev, HRGN hrgn ) DECLSPEC_HIDDEN; +extern BOOL dibdrv_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, + DWORD polylines ) DECLSPEC_HIDDEN; +extern BOOL dibdrv_Polyline( PHYSDEV dev, const POINT* pt, INT count ) DECLSPEC_HIDDEN; extern BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN; extern HBRUSH dibdrv_SelectBrush( PHYSDEV dev, HBRUSH hbrush ) DECLSPEC_HIDDEN; extern HPEN dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) DECLSPEC_HIDDEN; diff --git a/dlls/gdi32/dibdrv/graphics.c b/dlls/gdi32/dibdrv/graphics.c index ff83d1ad045..b2e9f2cff3f 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -146,6 +146,61 @@ BOOL dibdrv_PaintRgn( PHYSDEV dev, HRGN rgn ) return TRUE; } +/*********************************************************************** + * dibdrv_PolyPolyline + */ +BOOL dibdrv_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, DWORD polylines ) +{ + dibdrv_physdev *pdev = get_dibdrv_pdev(dev); + PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyPolyline ); + DWORD max_points = 0, i; + POINT *points; + + if (defer_pen( pdev )) return next->funcs->pPolyPolyline( next, pt, counts, polylines ); + + for (i = 0; i < polylines; i++) max_points = max( counts[i], max_points ); + + points = HeapAlloc( GetProcessHeap(), 0, max_points * sizeof(*pt) ); + if (!points) return FALSE; + + for (i = 0; i < polylines; i++) + { + memcpy( points, pt, counts[i] * sizeof(*pt) ); + pt += counts[i]; + LPtoDP( dev->hdc, points, counts[i] ); + + reset_dash_origin( pdev ); + pdev->pen_lines( pdev, counts[i], points ); + } + + HeapFree( GetProcessHeap(), 0, points ); + return TRUE; +} + +/*********************************************************************** + * dibdrv_Polyline + */ +BOOL dibdrv_Polyline( PHYSDEV dev, const POINT* pt, INT count ) +{ + dibdrv_physdev *pdev = get_dibdrv_pdev(dev); + PHYSDEV next = GET_NEXT_PHYSDEV( dev, pPolyline ); + POINT *points; + + if (defer_pen( pdev )) return next->funcs->pPolyline( next, pt, count ); + + points = HeapAlloc( GetProcessHeap(), 0, count * sizeof(*pt) ); + if (!points) return FALSE; + + memcpy( points, pt, count * sizeof(*pt) ); + LPtoDP( dev->hdc, points, count ); + + reset_dash_origin( pdev ); + pdev->pen_lines( pdev, count, points ); + + HeapFree( GetProcessHeap(), 0, points ); + return TRUE; +} + /*********************************************************************** * dibdrv_Rectangle */