Module: wine Branch: master Commit: 7ff16aff0644f6a5297c9cf037f97e9a8c185412 URL: https://source.winehq.org/git/wine.git/?a=commit;h=7ff16aff0644f6a5297c9cf03...
Author: Jeff Smith whydoubt@gmail.com Date: Wed Apr 15 15:07:11 2020 -0500
gdiplus: Reuse point when calling GdipAddPathArc on open figure.
Signed-off-by: Jeff Smith whydoubt@gmail.com Signed-off-by: Vincent Povirk vincent@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/gdiplus/graphicspath.c | 25 ++++++++++--------------- dlls/gdiplus/tests/graphicspath.c | 14 ++++++++++++++ 2 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 04806a95af..ba977f970a 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -241,7 +241,9 @@ static GpStatus extend_current_figure(GpPath *path, GDIPCONST PointF *points, IN GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2, REAL startAngle, REAL sweepAngle) { - INT count, old_count, i; + GpPointF *points; + GpStatus status; + INT count;
TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", path, x1, y1, x2, y2, startAngle, sweepAngle); @@ -250,26 +252,19 @@ GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x1, REAL y1, REAL x2, return InvalidParameter;
count = arc2polybezier(NULL, x1, y1, x2, y2, startAngle, sweepAngle); - if(count == 0) return Ok; - if(!lengthen_path(path, count)) + + points = heap_alloc_zero(sizeof(GpPointF)*count); + if(!points) return OutOfMemory;
- old_count = path->pathdata.Count; - arc2polybezier(&path->pathdata.Points[old_count], x1, y1, x2, y2, - startAngle, sweepAngle); + arc2polybezier(points, x1, y1, x2, y2, startAngle, sweepAngle);
- for(i = 0; i < count; i++){ - path->pathdata.Types[old_count + i] = PathPointTypeBezier; - } - - path->pathdata.Types[old_count] = - (path->newfigure ? PathPointTypeStart : PathPointTypeLine); - path->newfigure = FALSE; - path->pathdata.Count += count; + status = extend_current_figure(path, points, count, PathPointTypeBezier);
- return Ok; + heap_free(points); + return status; }
/******************************************************************************* diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index b3ee72f29b..a02500bc1d 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -435,6 +435,13 @@ static path_test_t arc_path[] = { {450.9, 824.1, PathPointTypeBezier, 0, 0}, /*36*/ {540.4, 676.9, PathPointTypeBezier | PathPointTypeCloseSubpath, 0, 1} /*37*/ }; +static path_test_t arc_path2[] = { + {1.0, 0.0, PathPointTypeStart, 0, 0}, /*0*/ + {1.0, 0.5, PathPointTypeLine, 0, 0}, /*1*/ + {1.0, 0.776142, PathPointTypeBezier, 0, 0}, /*2*/ + {0.776142, 1.0, PathPointTypeBezier, 0, 0}, /*3*/ + {0.5, 1.0, PathPointTypeBezier, 0, 0} /*4*/ + };
static void test_arc(void) { @@ -463,6 +470,13 @@ static void test_arc(void)
ok_path(path, arc_path, ARRAY_SIZE(arc_path), FALSE);
+ GdipResetPath(path); + GdipAddPathLine(path, 1.0, 0.0, 1.0, 0.5); + status = GdipAddPathArc(path, 0.0, 0.0, 1.0, 1.0, 0.0, 90.0); + expect(Ok, status); + + ok_path_fudge(path, arc_path2, ARRAY_SIZE(arc_path2), FALSE, 0.000005); + GdipDeletePath(path); }