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 <zzhang@codeweavers.com>
Signed-off-by: Vincent Povirk <vincent@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zhiyi Zhang 2018-06-20 15:14:19 +08:00 committed by Alexandre Julliard
parent 07cf5ed189
commit cba24001e4
2 changed files with 50 additions and 0 deletions

View file

@ -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);

View file

@ -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();