Module: wine Branch: master Commit: c6f6c3f727556734905a5bbf4fe1b59079e37bf5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c6f6c3f727556734905a5bbf4f...
Author: Huw Davies huw@codeweavers.com Date: Fri Aug 19 16:26:19 2011 +0100
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 64769be..03e3f65 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 bab52cd..760c02e 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 ff83d1a..b2e9f2c 100644 --- a/dlls/gdi32/dibdrv/graphics.c +++ b/dlls/gdi32/dibdrv/graphics.c @@ -147,6 +147,61 @@ BOOL dibdrv_PaintRgn( PHYSDEV dev, HRGN rgn ) }
/*********************************************************************** + * 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 */ BOOL dibdrv_Rectangle( PHYSDEV dev, INT left, INT top, INT right, INT bottom )