From aa0df2300e833a7037577036f6b4c3ba6dc1df66 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Mon, 4 Aug 2008 21:45:16 +0400 Subject: [PATCH] gdiplus: Implemented GdipAddPathPie/GdipAddPathPieI with test. --- dlls/gdiplus/gdiplus.spec | 4 +-- dlls/gdiplus/graphicspath.c | 51 +++++++++++++++++++++++++++++++ dlls/gdiplus/tests/graphicspath.c | 27 ++++++++++++++++ include/gdiplusflat.h | 2 ++ 4 files changed, 82 insertions(+), 2 deletions(-) diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index add7b0eea1f..57f9734251a 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -21,8 +21,8 @@ @ stdcall GdipAddPathLine(ptr long long long long) @ stdcall GdipAddPathLineI(ptr long long long long) @ stdcall GdipAddPathPath(ptr ptr long) -@ stub GdipAddPathPie -@ stub GdipAddPathPieI +@ stdcall GdipAddPathPie(ptr long long long long long long) +@ stdcall GdipAddPathPieI(ptr long long long long long long) @ stdcall GdipAddPathPolygon(ptr ptr long) @ stdcall GdipAddPathPolygonI(ptr ptr long) @ stdcall GdipAddPathRectangle(ptr long long long long) diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index c5925b6d1e5..51407c71d82 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -546,6 +546,57 @@ GpStatus WINGDIPAPI GdipAddPathPath(GpPath *path, GDIPCONST GpPath* addingPath, return Ok; } +GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height, + REAL startAngle, REAL sweepAngle) +{ + GpPointF *ptf; + GpStatus status; + INT i, count; + + if(!path) + return InvalidParameter; + + count = arc2polybezier(NULL, x, y, width, height, startAngle, sweepAngle); + + if(count == 0) + return Ok; + + ptf = GdipAlloc(sizeof(GpPointF)*count); + if(!ptf) + return OutOfMemory; + + arc2polybezier(ptf, x, y, width, height, startAngle, sweepAngle); + + status = GdipAddPathLine(path, (width - x)/2, (height - y)/2, ptf[0].X, ptf[0].Y); + if(status != Ok){ + GdipFree(ptf); + return status; + } + /* one spline is already added as a line endpoint */ + if(!lengthen_path(path, count - 1)){ + GdipFree(ptf); + return OutOfMemory; + } + + memcpy(&(path->pathdata.Points[path->pathdata.Count]), &(ptf[1]),sizeof(GpPointF)*(count-1)); + for(i = 0; i < count-1; i++) + path->pathdata.Types[path->pathdata.Count+i] = PathPointTypeBezier; + + path->pathdata.Count += count-1; + + GdipClosePathFigure(path); + + GdipFree(ptf); + + return status; +} + +GpStatus WINGDIPAPI GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height, + REAL startAngle, REAL sweepAngle) +{ + return GdipAddPathPieI(path, (REAL)x, (REAL)y, (REAL)width, (REAL)height, startAngle, sweepAngle); +} + GpStatus WINGDIPAPI GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count) { INT old_count; diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index 97e92fa3e80..d08b20b8411 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -856,6 +856,32 @@ static void test_reverse(void) GdipDeletePath(path); } +static path_test_t addpie_path[] = { + {50.0, 25.0, PathPointTypeStart, 0, 0}, /*0*/ + {97.2, 33.3, PathPointTypeLine, 0, 0}, /*1*/ + {91.8, 40.9, PathPointTypeBezier,0, 0}, /*2*/ + {79.4, 46.8, PathPointTypeBezier,0, 0}, /*3*/ + {63.9, 49.0, PathPointTypeBezier | PathPointTypeCloseSubpath, 0, 0} /*4*/ + }; + +static void test_addpie(void) +{ + GpStatus status; + GpPath *path; + + GdipCreatePath(FillModeAlternate, &path); + + /* NULL argument */ + status = GdipAddPathPie(NULL, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); + expect(InvalidParameter, status); + + 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); + + GdipDeletePath(path); +} + START_TEST(graphicspath) { struct GdiplusStartupInput gdiplusStartupInput; @@ -882,6 +908,7 @@ START_TEST(graphicspath) test_addcurve(); test_addclosedcurve(); test_reverse(); + test_addpie(); GdiplusShutdown(gdiplusToken); } diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 4203e164a55..ed88096b9d5 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -261,6 +261,8 @@ GpStatus WINGDIPAPI GdipAddPathLine2(GpPath*,GDIPCONST GpPointF*,INT); GpStatus WINGDIPAPI GdipAddPathLine2I(GpPath*,GDIPCONST GpPoint*,INT); GpStatus WINGDIPAPI GdipAddPathLineI(GpPath*,INT,INT,INT,INT); GpStatus WINGDIPAPI GdipAddPathPath(GpPath*,GDIPCONST GpPath*,BOOL); +GpStatus WINGDIPAPI GdipAddPathPie(GpPath*,REAL,REAL,REAL,REAL,REAL,REAL); +GpStatus WINGDIPAPI GdipAddPathPieI(GpPath*,INT,INT,INT,INT,REAL,REAL); GpStatus WINGDIPAPI GdipAddPathPolygon(GpPath*,GDIPCONST GpPointF*,INT); GpStatus WINGDIPAPI GdipAddPathPolygonI(GpPath*,GDIPCONST GpPoint*,INT); GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath*,REAL,REAL,REAL,REAL);