diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 81ff0aec915..0087aefda02 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -224,7 +224,7 @@ @ stub GdipFillPieI @ stub GdipFillPolygon2 @ stub GdipFillPolygon2I -@ stub GdipFillPolygon +@ stdcall GdipFillPolygon(ptr ptr ptr long long) @ stdcall GdipFillPolygonI(ptr ptr ptr long long) @ stub GdipFillRectangle @ stub GdipFillRectangleI diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 2be9fc72ccb..7c8fc168cdc 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -1224,6 +1224,45 @@ GpStatus WINGDIPAPI GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, return Ok; } +GpStatus WINGDIPAPI GdipFillPolygon(GpGraphics *graphics, GpBrush *brush, + GDIPCONST GpPointF *points, INT count, GpFillMode fillMode) +{ + INT save_state; + GpPointF *ptf = NULL; + POINT *pti = NULL; + GpStatus retval = Ok; + + if(!graphics || !brush || !points || !count) + return InvalidParameter; + + ptf = GdipAlloc(count * sizeof(GpPointF)); + pti = GdipAlloc(count * sizeof(POINT)); + if(!ptf || !pti){ + retval = OutOfMemory; + goto end; + } + + memcpy(ptf, points, count * sizeof(GpPointF)); + + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); + SelectObject(graphics->hdc, brush->gdibrush); + SelectObject(graphics->hdc, GetStockObject(NULL_PEN)); + SetPolyFillMode(graphics->hdc, (fillMode == FillModeAlternate ? ALTERNATE + : WINDING)); + + transform_and_round_points(graphics, pti, ptf, count); + Polygon(graphics->hdc, pti, count); + + RestoreDC(graphics->hdc, save_state); + +end: + GdipFree(ptf); + GdipFree(pti); + + return retval; +} + GpStatus WINGDIPAPI GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count, GpFillMode fillMode) { diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 045c17bc6c7..cd4f3d643b8 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -102,6 +102,8 @@ GpStatus WINGDIPAPI GdipClosePathFigure(GpPath*); GpStatus WINGDIPAPI GdipClosePathFigures(GpPath*); GpStatus WINGDIPAPI GdipCreatePath(GpFillMode,GpPath**); GpStatus WINGDIPAPI GdipDeletePath(GpPath*); +GpStatus WINGDIPAPI GdipFillPolygon(GpGraphics*,GpBrush*,GDIPCONST GpPointF*, + INT,GpFillMode); GpStatus WINGDIPAPI GdipGetPathFillMode(GpPath*,GpFillMode*); GpStatus WINGDIPAPI GdipGetPathPoints(GpPath*,GpPointF*,INT); GpStatus WINGDIPAPI GdipGetPathTypes(GpPath*,BYTE*,INT);