From 8cb170126ab51f1c1c2b32f7eaf261237d6bcd45 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 9 Feb 2009 23:25:06 +0300 Subject: [PATCH] gdiplus: Handle zero width/height in GdipAddPathPie. --- dlls/gdiplus/graphicspath.c | 11 +++++++++++ dlls/gdiplus/tests/graphicspath.c | 21 ++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index 042d4a2f51e..4703ace60b4 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -723,6 +723,17 @@ GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REA if(!path) return InvalidParameter; + /* on zero width/height only start point added */ + if(width <= 1e-7 || height <= 1e-7){ + if(!lengthen_path(path, 1)) + return OutOfMemory; + path->pathdata.Points[0].X = x + width / 2.0; + path->pathdata.Points[0].Y = y + height / 2.0; + path->pathdata.Types[0] = PathPointTypeStart | PathPointTypeCloseSubpath; + path->pathdata.Count = 1; + return InvalidParameter; + } + count = arc2polybezier(NULL, x, y, width, height, startAngle, sweepAngle); if(count == 0) diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index 416d80caa90..d256cacd1a2 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -907,7 +907,12 @@ static path_test_t addpie_path[] = { {79.4, 46.8, PathPointTypeBezier,0, 0}, /*3*/ {63.9, 49.0, PathPointTypeBezier | PathPointTypeCloseSubpath, 0, 0} /*4*/ }; - +static path_test_t addpie_path2[] = { + {0.0, 30.0, PathPointTypeStart | PathPointTypeCloseSubpath, 0, 0} /*0*/ + }; +static path_test_t addpie_path3[] = { + {30.0, 0.0, PathPointTypeStart | PathPointTypeCloseSubpath, 0, 0} /*0*/ + }; static void test_addpie(void) { GpStatus status; @@ -922,6 +927,20 @@ static void test_addpie(void) status = GdipAddPathPie(path, 0.0, 0.0, 100.0, 50.0, 10.0, 50.0); expect(Ok, status); ok_path(path, addpie_path, sizeof(addpie_path)/sizeof(path_test_t), FALSE); + status = GdipResetPath(path); + expect(Ok, status); + + /* zero width base ellipse */ + status = GdipAddPathPie(path, 0.0, 0.0, 0.0, 60.0, -90.0, 24.0); + expect(InvalidParameter, status); + ok_path(path, addpie_path2, sizeof(addpie_path2)/sizeof(path_test_t), FALSE); + status = GdipResetPath(path); + expect(Ok, status); + + /* zero height base ellipse */ + status = GdipAddPathPie(path, 0.0, 0.0, 60.0, 0.0 , -90.0, 24.0); + expect(InvalidParameter, status); + ok_path(path, addpie_path3, sizeof(addpie_path3)/sizeof(path_test_t), FALSE); GdipDeletePath(path); }