gdi32: Implement Polyline and PolyPolyline in the dib driver.
authorHuw Davies <huw@codeweavers.com>
Fri, 19 Aug 2011 15:26:19 +0000 (16:26 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 22 Aug 2011 14:19:24 +0000 (16:19 +0200)
dlls/gdi32/dibdrv/dc.c
dlls/gdi32/dibdrv/dibdrv.h
dlls/gdi32/dibdrv/graphics.c

index 64769be..03e3f65 100644 (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 */
index bab52cd..760c02e 100644 (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;
index ff83d1a..b2e9f2c 100644 (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
  */