Module: wine Branch: master Commit: 092531df7124f1e076648bd5b2f578d0ce2abfb2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=092531df7124f1e076648bd5b2...
Author: Vincent Povirk vincent@codeweavers.com Date: Thu Oct 13 16:23:16 2016 -0500
gdiplus: Add non-gdi32 implementation of GdipDrawPath.
Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdiplus/graphics.c | 84 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 69 insertions(+), 15 deletions(-)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index c75618c..56faa16 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -3375,26 +3375,12 @@ GpStatus WINGDIPAPI GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST return retval; }
-GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) +GpStatus GDI32_GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) { INT save_state; GpStatus retval; HRGN hrgn=NULL;
- TRACE("(%p, %p, %p)\n", graphics, pen, path); - - if(!pen || !graphics) - return InvalidParameter; - - if(graphics->busy) - return ObjectBusy; - - if (!graphics->hdc) - { - FIXME("graphics object has no HDC\n"); - return Ok; - } - save_state = prepare_dc(graphics, pen);
retval = get_clip_hrgn(graphics, &hrgn); @@ -3415,6 +3401,74 @@ end: return retval; }
+GpStatus SOFTWARE_GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) +{ + GpStatus stat; + GpPath *wide_path; + GpMatrix *transform=NULL; + + stat = GdipClonePath(path, &wide_path); + + if (stat != Ok) + return stat; + + if (pen->unit == UnitPixel) + { + /* We have to transform this to device coordinates to get the widths right. */ + stat = GdipCreateMatrix(&transform); + + if (stat == Ok) + stat = get_graphics_transform(graphics, CoordinateSpaceDevice, + CoordinateSpaceWorld, transform); + } + + if (stat == Ok) + stat = GdipWidenPath(wide_path, pen, transform, 1.0); + + if (pen->unit == UnitPixel) + { + /* Transform the path back to world coordinates */ + if (stat == Ok) + stat = GdipInvertMatrix(transform); + + if (stat == Ok) + stat = GdipTransformPath(wide_path, transform); + } + + /* Actually draw the path */ + if (stat == Ok) + stat = GdipFillPath(graphics, pen->brush, wide_path); + + GdipDeleteMatrix(transform); + + GdipDeletePath(wide_path); + + return stat; +} + +GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) +{ + GpStatus retval; + + TRACE("(%p, %p, %p)\n", graphics, pen, path); + + if(!pen || !graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + if (path->pathdata.Count == 0) + return Ok; + + if (!graphics->hdc) + retval = SOFTWARE_GdipDrawPath(graphics, pen, path); + else + retval = GDI32_GdipDrawPath(graphics, pen, path); + + return retval; +} + GpStatus WINGDIPAPI GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle) {