gdiplus: Implemented GdipFillClosedCurve and GdipFillClosedCurveI.
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 06aa0cb..3201d32 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -215,8 +215,8 @@
@ stub GdipEnumerateMetafileSrcRectDestRectI
@ stdcall GdipFillClosedCurve2(ptr ptr ptr long long long)
@ stdcall GdipFillClosedCurve2I(ptr ptr ptr long long long)
-@ stub GdipFillClosedCurve
-@ stub GdipFillClosedCurveI
+@ stdcall GdipFillClosedCurve(ptr ptr ptr long)
+@ stdcall GdipFillClosedCurveI(ptr ptr ptr long)
@ stdcall GdipFillEllipse(ptr ptr long long long long)
@ stdcall GdipFillEllipseI(ptr ptr long long long long)
@ stdcall GdipFillPath(ptr ptr ptr)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index f2d7db6..ada2c58 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -2729,6 +2729,22 @@
return stat;
}
+GpStatus WINGDIPAPI GdipFillClosedCurve(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPointF *points, INT count)
+{
+ TRACE("(%p, %p, %p, %d)\n", graphics, brush, points, count);
+ return GdipFillClosedCurve2(graphics, brush, points, count,
+ 0.5f, FillModeAlternate);
+}
+
+GpStatus WINGDIPAPI GdipFillClosedCurveI(GpGraphics *graphics, GpBrush *brush,
+ GDIPCONST GpPoint *points, INT count)
+{
+ TRACE("(%p, %p, %p, %d)\n", graphics, brush, points, count);
+ return GdipFillClosedCurve2I(graphics, brush, points, count,
+ 0.5f, FillModeAlternate);
+}
+
GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x,
REAL y, REAL width, REAL height)
{
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c
index c0692c5..441367e 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -1180,6 +1180,139 @@
ReleaseDC(hwnd, hdc);
}
+static void test_GdipFillClosedCurve(void)
+{
+ GpStatus status;
+ GpGraphics *graphics = NULL;
+ GpSolidFill *brush = NULL;
+ HDC hdc = GetDC( hwnd );
+ GpPointF points[3];
+
+ points[0].X = 0;
+ points[0].Y = 0;
+
+ points[1].X = 40;
+ points[1].Y = 20;
+
+ points[2].X = 10;
+ points[2].Y = 40;
+
+ /* make a graphics object and brush object */
+ ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+ status = GdipCreateFromHDC(hdc, &graphics);
+ expect(Ok, status);
+ ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+ GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+ /* InvalidParameter cases: null graphics, null brush, null points */
+ status = GdipFillClosedCurve(NULL, NULL, NULL, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(graphics, NULL, NULL, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(NULL, (GpBrush*)brush, NULL, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(NULL, NULL, points, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, NULL, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(graphics, NULL, points, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(NULL, (GpBrush*)brush, points, 3);
+ expect(InvalidParameter, status);
+
+ /* InvalidParameter cases: invalid count */
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, -1);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 0);
+ expect(InvalidParameter, status);
+
+ /* Valid test cases */
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 1);
+ expect(Ok, status);
+
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 2);
+ expect(Ok, status);
+
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, points, 3);
+ expect(Ok, status);
+
+ GdipDeleteGraphics(graphics);
+ GdipDeleteBrush((GpBrush*)brush);
+
+ ReleaseDC(hwnd, hdc);
+}
+
+static void test_GdipFillClosedCurveI(void)
+{
+ GpStatus status;
+ GpGraphics *graphics = NULL;
+ GpSolidFill *brush = NULL;
+ HDC hdc = GetDC( hwnd );
+ GpPoint points[3];
+
+ points[0].X = 0;
+ points[0].Y = 0;
+
+ points[1].X = 40;
+ points[1].Y = 20;
+
+ points[2].X = 10;
+ points[2].Y = 40;
+
+ /* make a graphics object and brush object */
+ ok(hdc != NULL, "Expected HDC to be initialized\n");
+
+ status = GdipCreateFromHDC(hdc, &graphics);
+ expect(Ok, status);
+ ok(graphics != NULL, "Expected graphics to be initialized\n");
+
+ GdipCreateSolidFill((ARGB)0xdeadbeef, &brush);
+
+ /* InvalidParameter cases: null graphics, null brush */
+ /* Note: GdipFillClosedCurveI and GdipFillClosedCurve2I hang in Windows
+ when points == NULL, so don't test this condition */
+ status = GdipFillClosedCurveI(NULL, NULL, points, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurveI(graphics, NULL, points, 3);
+ expect(InvalidParameter, status);
+
+ status = GdipFillClosedCurveI(NULL, (GpBrush*)brush, points, 3);
+ expect(InvalidParameter, status);
+
+ /* InvalidParameter cases: invalid count */
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 0);
+ expect(InvalidParameter, status);
+
+ /* OutOfMemory cases: large (unsigned) int */
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, -1);
+ expect(OutOfMemory, status);
+
+ /* Valid test cases */
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 1);
+ expect(Ok, status);
+
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 2);
+ expect(Ok, status);
+
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, points, 3);
+ expect(Ok, status);
+
+ GdipDeleteGraphics(graphics);
+ GdipDeleteBrush((GpBrush*)brush);
+
+ ReleaseDC(hwnd, hdc);
+}
+
static void test_Get_Release_DC(void)
{
GpStatus status;
@@ -1345,6 +1478,10 @@
expect(ObjectBusy, status); status = Ok;
status = GdipFillClosedCurve2I(graphics, (GpBrush*)brush, pt, 5, 1.0, FillModeAlternate);
expect(ObjectBusy, status); status = Ok;
+ status = GdipFillClosedCurve(graphics, (GpBrush*)brush, ptf, 5);
+ expect(ObjectBusy, status); status = Ok;
+ status = GdipFillClosedCurveI(graphics, (GpBrush*)brush, pt, 5);
+ expect(ObjectBusy, status); status = Ok;
status = GdipFillEllipse(graphics, (GpBrush*)brush, 0.0, 0.0, 100.0, 100.0);
expect(ObjectBusy, status); status = Ok;
status = GdipFillEllipseI(graphics, (GpBrush*)brush, 0, 0, 100, 100);
@@ -2811,6 +2948,8 @@
test_GdipDrawCurve3I();
test_GdipDrawLineI();
test_GdipDrawLinesI();
+ test_GdipFillClosedCurve();
+ test_GdipFillClosedCurveI();
test_GdipDrawString();
test_GdipGetNearestColor();
test_GdipGetVisibleClipBounds();
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index 8312e16..c361d10 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -210,6 +210,8 @@
REAL,GpFillMode);
GpStatus WINGDIPAPI GdipFillClosedCurve2I(GpGraphics*,GpBrush*,GDIPCONST GpPoint*,INT,
REAL,GpFillMode);
+GpStatus WINGDIPAPI GdipFillClosedCurve(GpGraphics*,GpBrush*,GDIPCONST GpPointF*,INT);
+GpStatus WINGDIPAPI GdipFillClosedCurveI(GpGraphics*,GpBrush*,GDIPCONST GpPoint*,INT);
GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics*,GpBrush*,REAL,REAL,REAL,REAL);
GpStatus WINGDIPAPI GdipFillEllipseI(GpGraphics*,GpBrush*,INT,INT,INT,INT);
GpStatus WINGDIPAPI GdipFillPath(GpGraphics*,GpBrush*,GpPath*);