[2/2] gdiplus: Implemented GdipFillClosedCurve and GdipFillClosedCurveI.

Wade Gobel wgobel at codeweavers.com
Thu Jul 22 16:09:07 CDT 2010


---
 dlls/gdiplus/gdiplus.spec     |    4 +-
 dlls/gdiplus/graphics.c       |   16 +++++
 dlls/gdiplus/tests/graphics.c |  139 +++++++++++++++++++++++++++++++++++++++++
 include/gdiplusflat.h         |    2 +
 4 files changed, 159 insertions(+), 2 deletions(-)

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 @@ GpStatus WINGDIPAPI GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush,
     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..13eec3b 100644
--- a/dlls/gdiplus/tests/graphics.c
+++ b/dlls/gdiplus/tests/graphics.c
@@ -1180,6 +1180,139 @@ static void test_GdipDrawLinesI(void)
     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 @@ static void test_Get_Release_DC(void)
     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 @@ START_TEST(graphics)
     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 @@ GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics*,GpBrush*,GDIPCONST GpPointF
     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*);
-- 
1.7.0.4




More information about the wine-patches mailing list