gdi32: Implement Polyline and PolyPolyline in the dib driver.

This commit is contained in:
Huw Davies 2011-08-19 16:26:19 +01:00 committed by Alexandre Julliard
parent 0f40ad8a3d
commit c6f6c3f727
3 changed files with 60 additions and 2 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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
*/