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 a793665683..2d23085e8a 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -4264,6 +4264,9 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p if(graphics->busy) return ObjectBusy;
+ if (!path->pathdata.Count) + return Ok; + if (graphics->image && graphics->image->type == ImageTypeMetafile) return METAFILE_FillPath((GpMetafile*)graphics->image, brush, path);
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();