Alexandre Julliard : winex11: Implement FillPath, StrokeAndFillPath and StrokePath.

Alexandre Julliard julliard at winehq.org
Thu Jun 16 10:20:56 CDT 2016


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Jun 16 14:15:05 2016 +0900

winex11: Implement FillPath, StrokeAndFillPath and StrokePath.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winex11.drv/graphics.c | 101 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/winex11.drv/init.c     |   6 +--
 dlls/winex11.drv/x11drv.h   |   3 ++
 3 files changed, 107 insertions(+), 3 deletions(-)

diff --git a/dlls/winex11.drv/graphics.c b/dlls/winex11.drv/graphics.c
index f23a502..e8c59f9 100644
--- a/dlls/winex11.drv/graphics.c
+++ b/dlls/winex11.drv/graphics.c
@@ -1227,6 +1227,107 @@ BOOL X11DRV_PolyPolyline( PHYSDEV dev, const POINT* pt, const DWORD* counts, DWO
     return TRUE;
 }
 
+/* helper for path stroking and filling functions */
+static BOOL x11drv_stroke_and_fill_path( PHYSDEV dev, BOOL stroke, BOOL fill )
+{
+    X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
+    POINT *points;
+    BYTE *flags;
+    BOOL ret = FALSE;
+    XPoint *xpoints;
+    int i, j, size;
+
+    FlattenPath( dev->hdc );
+    if ((size = GetPath( dev->hdc, NULL, NULL, 0 )) == -1) return FALSE;
+    if (!size)
+    {
+        AbortPath( dev->hdc );
+        return TRUE;
+    }
+    xpoints = HeapAlloc( GetProcessHeap(), 0, (size + 1) * sizeof(*xpoints) );
+    points = HeapAlloc( GetProcessHeap(), 0, size * sizeof(*points) );
+    flags = HeapAlloc( GetProcessHeap(), 0, size * sizeof(*flags) );
+    if (!points || !flags || !xpoints) goto done;
+    if (GetPath( dev->hdc, points, flags, size ) == -1) goto done;
+    LPtoDP( dev->hdc, points, size );
+
+    if (fill && X11DRV_SetupGCForBrush( physDev ))
+    {
+        XRectangle *rect;
+        HRGN hrgn = PathToRegion( dev->hdc );
+        RGNDATA *data = X11DRV_GetRegionData( hrgn, 0 );
+
+        DeleteObject( hrgn );
+        if (!data) goto done;
+        rect = (XRectangle *)data->Buffer;
+        for (i = 0; i < data->rdh.nCount; i++)
+        {
+            rect[i].x += physDev->dc_rect.left;
+            rect[i].y += physDev->dc_rect.top;
+        }
+
+        XFillRectangles( gdi_display, physDev->drawable, physDev->gc, rect, data->rdh.nCount );
+        HeapFree( GetProcessHeap(), 0, data );
+    }
+
+    if (stroke && X11DRV_SetupGCForPen ( physDev ))
+    {
+        for (i = j = 0; i < size; i++, j++)
+        {
+            if (flags[i] == PT_MOVETO)
+            {
+                if (j > 1)
+                {
+                    if (fill || (flags[i - 1] & PT_CLOSEFIGURE)) xpoints[j++] = xpoints[0];
+                    XDrawLines( gdi_display, physDev->drawable, physDev->gc, xpoints, j, CoordModeOrigin );
+                }
+                j = 0;
+            }
+            xpoints[j].x = physDev->dc_rect.left + points[i].x;
+            xpoints[j].y = physDev->dc_rect.top + points[i].y;
+        }
+        if (j > 1)
+        {
+            if (fill || (flags[i - 1] & PT_CLOSEFIGURE)) xpoints[j++] = xpoints[0];
+            XDrawLines( gdi_display, physDev->drawable, physDev->gc, xpoints, j, CoordModeOrigin );
+        }
+    }
+
+    add_pen_device_bounds( physDev, points, size );
+    AbortPath( dev->hdc );
+    ret = TRUE;
+
+done:
+    HeapFree( GetProcessHeap(), 0, xpoints );
+    HeapFree( GetProcessHeap(), 0, points );
+    HeapFree( GetProcessHeap(), 0, flags );
+    return ret;
+}
+
+/**********************************************************************
+ *          X11DRV_FillPath
+ */
+BOOL X11DRV_FillPath( PHYSDEV dev )
+{
+    return x11drv_stroke_and_fill_path( dev, FALSE, TRUE );
+}
+
+/**********************************************************************
+ *          X11DRV_StrokeAndFillPath
+ */
+BOOL X11DRV_StrokeAndFillPath( PHYSDEV dev )
+{
+    return x11drv_stroke_and_fill_path( dev, TRUE, TRUE );
+}
+
+/**********************************************************************
+ *          X11DRV_StrokePath
+ */
+BOOL X11DRV_StrokePath( PHYSDEV dev )
+{
+    return x11drv_stroke_and_fill_path( dev, TRUE, FALSE );
+}
+
 
 /**********************************************************************
  *          X11DRV_InternalFloodFill
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 6bc4fb3..af2fd92 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -494,7 +494,7 @@ static const struct gdi_dc_funcs x11drv_funcs =
     X11DRV_ExtFloodFill,                /* pExtFloodFill */
     NULL,                               /* pExtSelectClipRgn */
     NULL,                               /* pExtTextOut */
-    NULL,                               /* pFillPath */
+    X11DRV_FillPath,                    /* pFillPath */
     NULL,                               /* pFillRgn */
     NULL,                               /* pFlattenPath */
     NULL,                               /* pFontIsLinked */
@@ -589,8 +589,8 @@ static const struct gdi_dc_funcs x11drv_funcs =
     NULL,                               /* pStartPage */
     X11DRV_StretchBlt,                  /* pStretchBlt */
     NULL,                               /* pStretchDIBits */
-    NULL,                               /* pStrokeAndFillPath */
-    NULL,                               /* pStrokePath */
+    X11DRV_StrokeAndFillPath,           /* pStrokeAndFillPath */
+    X11DRV_StrokePath,                  /* pStrokePath */
     X11DRV_UnrealizePalette,            /* pUnrealizePalette */
     NULL,                               /* pWidenPath */
     X11DRV_wine_get_wgl_driver,         /* wine_get_wgl_driver */
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 23f4ab6..2180851 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -150,6 +150,7 @@ extern BOOL X11DRV_Chord( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
 extern BOOL X11DRV_Ellipse( PHYSDEV dev, INT left, INT top, INT right, INT bottom ) DECLSPEC_HIDDEN;
 extern INT X11DRV_EnumICMProfiles( PHYSDEV dev, ICMENUMPROCW proc, LPARAM lparam ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_ExtFloodFill( PHYSDEV dev, INT x, INT y, COLORREF color, UINT fillType ) DECLSPEC_HIDDEN;
+extern BOOL X11DRV_FillPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_GetDeviceGammaRamp( PHYSDEV dev, LPVOID ramp ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_GetICMProfile( PHYSDEV dev, LPDWORD size, LPWSTR filename ) DECLSPEC_HIDDEN;
 extern DWORD X11DRV_GetImage( PHYSDEV dev, BITMAPINFO *info,
@@ -183,6 +184,8 @@ extern BOOL X11DRV_SetDeviceGammaRamp( PHYSDEV dev, LPVOID ramp ) DECLSPEC_HIDDE
 extern COLORREF X11DRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_StretchBlt( PHYSDEV dst_dev, struct bitblt_coords *dst,
                                PHYSDEV src_dev, struct bitblt_coords *src, DWORD rop ) DECLSPEC_HIDDEN;
+extern BOOL X11DRV_StrokeAndFillPath( PHYSDEV dev ) DECLSPEC_HIDDEN;
+extern BOOL X11DRV_StrokePath( PHYSDEV dev ) DECLSPEC_HIDDEN;
 extern BOOL X11DRV_UnrealizePalette( HPALETTE hpal ) DECLSPEC_HIDDEN;
 
 /* X11 driver internal functions */




More information about the wine-cvs mailing list