Nikolay Sivov : gdiplus: Implemented GdipAddPathPie/ GdipAddPathPieI with test.
Alexandre Julliard
julliard at winehq.org
Tue Aug 5 07:26:22 CDT 2008
Module: wine
Branch: master
Commit: aa0df2300e833a7037577036f6b4c3ba6dc1df66
URL: http://source.winehq.org/git/wine.git/?a=commit;h=aa0df2300e833a7037577036f6b4c3ba6dc1df66
Author: Nikolay Sivov <bunglehead at gmail.com>
Date: Mon Aug 4 21:45:16 2008 +0400
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 add7b0e..57f9734 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 c5925b6..51407c7 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 97e92fa..d08b20b 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 4203e16..ed88096 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);
More information about the wine-cvs
mailing list