Huw Davies : gdi32: Implement Polyline and PolyPolyline in the dib driver.

Alexandre Julliard julliard at winehq.org
Mon Aug 22 13:29:11 CDT 2011


Module: wine
Branch: master
Commit: c6f6c3f727556734905a5bbf4fe1b59079e37bf5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c6f6c3f727556734905a5bbf4fe1b59079e37bf5

Author: Huw Davies <huw at 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 )




More information about the wine-cvs mailing list