There is no point filling an empty path. And an empty path will cause SelectClipPath() used in brush_fill_path() to return error.
Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/gdiplus/graphics.c | 3 +++ dlls/gdiplus/tests/graphics.c | 47 +++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+)
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 030019cb4b..3ba3f0f4f4 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -4268,6 +4268,9 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p if(!brush || !graphics || !path) return InvalidParameter;
+ if (!path->pathdata.Count) + return Ok; + if(graphics->busy) return ObjectBusy;
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index ae75c0efc1..5eb0a8a4d0 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -1539,6 +1539,52 @@ static void test_GdipFillClosedCurveI(void) ReleaseDC(hwnd, hdc); }
+static void test_GdipFillPath(void) +{ + GpStatus status; + GpGraphics *graphics; + GpSolidFill *brush; + GpPath *path; + HDC hdc = GetDC(hwnd); + + 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"); + status = GdipCreateSolidFill((ARGB)0xffffffff, &brush); + expect(Ok, status); + ok(brush != NULL, "Expected brush to be initialized\n"); + status = GdipCreatePath(FillModeAlternate, &path); + expect(Ok, status); + ok(path != NULL, "Expected path to be initialized\n"); + + /* Empty path */ + GdipResetPath(path); + status = GdipFillPath(graphics, (GpBrush *)brush, path); + expect(Ok, status); + + /* Not closed path */ + GdipResetPath(path); + status = GdipAddPathLineI(path, 0, 0, 2, 2); + expect(Ok, status); + status = GdipAddPathLineI(path, 2, 2, 4, 0); + expect(Ok, status); + status = GdipFillPath(graphics, (GpBrush *)brush, path); + expect(Ok, status); + + /* Closed path */ + GdipResetPath(path); + status = GdipAddPathRectangle(path, 0, 0, 4, 4); + expect(Ok, status); + status = GdipFillPath(graphics, (GpBrush *)brush, path); + expect(Ok, status); + + GdipDeletePath(path); + GdipDeleteBrush((GpBrush *)brush); + GdipDeleteGraphics(graphics); + ReleaseDC(hwnd, hdc); +} + static void test_Get_Release_DC(void) { GpStatus status; @@ -6795,6 +6841,7 @@ START_TEST(graphics) test_GdipDrawImagePointsRect(); test_GdipFillClosedCurve(); test_GdipFillClosedCurveI(); + test_GdipFillPath(); test_GdipDrawString(); test_GdipGetNearestColor(); test_GdipGetVisibleClipBounds();
This breaks a test:
graphics.c:1764: Test failed: Expected 4, got 0 0060:fixme:gdiplus:GdipGetNearestColor (0x88120, 0x23f96c): Passing color unmodified 0060:fixme:gdiplus:GdipMeasureDriverString Ignoring flags 100 Makefile:327: recipe for target 'graphics.ok' failed make: *** [graphics.ok] Error 1