diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c index dbe221cf0a2..265aba0c0af 100644 --- a/dlls/gdiplus/brush.c +++ b/dlls/gdiplus/brush.c @@ -60,12 +60,27 @@ GpStatus WINGDIPAPI GdipCreatePathGradientFromPath(GDIPCONST GpPath* path, *grad = GdipAlloc(sizeof(GpPathGradient)); if (!*grad) return OutOfMemory; + (*grad)->pathdata.Count = path->pathdata.Count; + (*grad)->pathdata.Points = GdipAlloc(path->pathdata.Count * sizeof(PointF)); + (*grad)->pathdata.Types = GdipAlloc(path->pathdata.Count); + + if(!(*grad)->pathdata.Points || !(*grad)->pathdata.Types){ + GdipFree((*grad)->pathdata.Points); + GdipFree((*grad)->pathdata.Types); + GdipFree(*grad); + return OutOfMemory; + } + + memcpy((*grad)->pathdata.Points, path->pathdata.Points, + path->pathdata.Count * sizeof(PointF)); + memcpy((*grad)->pathdata.Types, path->pathdata.Types, path->pathdata.Count); + (*grad)->brush.lb.lbStyle = BS_SOLID; (*grad)->brush.lb.lbColor = col; (*grad)->brush.lb.lbHatch = 0; (*grad)->brush.gdibrush = CreateSolidBrush(col); - (*grad)->brush.bt = BrushTypeSolidColor; + (*grad)->brush.bt = BrushTypePathGradient; (*grad)->centercolor = 0xffffffff; (*grad)->wrap = WrapModeClamp; @@ -111,6 +126,17 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush) return Ok; } +GpStatus WINGDIPAPI GdipGetPathGradientPointCount(GpPathGradient *grad, + INT *count) +{ + if(!grad || !count) + return InvalidParameter; + + *count = grad->pathdata.Count; + + return Ok; +} + GpStatus WINGDIPAPI GdipGetSolidFillColor(GpSolidFill *sf, ARGB *argb) { if(!sf || !argb) diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index f92c18c40c6..dba0b244d29 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -333,7 +333,7 @@ @ stub GdipGetPathGradientFocusScales @ stub GdipGetPathGradientGammaCorrection @ stub GdipGetPathGradientPath -@ stub GdipGetPathGradientPointCount +@ stdcall GdipGetPathGradientPointCount(ptr ptr) @ stub GdipGetPathGradientPresetBlend @ stub GdipGetPathGradientPresetBlendCount @ stub GdipGetPathGradientRect diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index ee120d95cc7..1c59a59f4f0 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -94,6 +94,7 @@ struct GpSolidFill{ struct GpPathGradient{ GpBrush brush; + PathData pathdata; ARGB centercolor; GpWrapMode wrap; }; diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 83aea93e601..4a90d32b488 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -92,6 +92,7 @@ GpStatus WINGDIPAPI GdipCreatePathGradientFromPath(GDIPCONST GpPath*, GpPathGradient**); GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB,GpSolidFill**); GpStatus WINGDIPAPI GdipGetBrushType(GpBrush*,GpBrushType*); +GpStatus WINGDIPAPI GdipGetPathGradientPointCount(GpPathGradient*,INT*); GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush*); GpStatus WINGDIPAPI GdipGetSolidFillColor(GpSolidFill*,ARGB*); GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient*,ARGB);