From cba24001e482fa8a8a1fbf5d5390539e2792b1aa Mon Sep 17 00:00:00 2001 From: Zhiyi Zhang Date: Wed, 20 Jun 2018 15:14:19 +0800 Subject: [PATCH] gdiplus: Avoid calling GdipFillPath() with an empty path. 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 Signed-off-by: Vincent Povirk Signed-off-by: Alexandre Julliard --- 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 a793665683b..2d23085e8a1 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 ae75c0efc13..5eb0a8a4d00 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(); -- 2.11.4.GIT