You should also update GdipCloneBrush so that it makes a copy of this new array.
On Sun, Mar 28, 2010 at 11:22 PM, Justin Chevrier <jchevrier(a)gmail.com> wrote:
> Now taking a copy of the color array. Thanks Nikolay
> ---
> dlls/gdiplus/brush.c | 27 +++++++++++++++++++--------
> dlls/gdiplus/gdiplus_private.h | 2 ++
> dlls/gdiplus/tests/brush.c | 6 +++---
> 3 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
> index 8994b87..7f5c8f7 100644
> --- a/dlls/gdiplus/brush.c
> +++ b/dlls/gdiplus/brush.c
> @@ -578,9 +578,10 @@ GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF* points,
> GdipFree(*grad);
> return OutOfMemory;
> }
> - (*grad)->blendfac[0] = 1.0;
> - (*grad)->blendpos = NULL;
> - (*grad)->blendcount = 1;
> + (*grad)->blendfac[0] = 1.0;
> + (*grad)->blendpos = NULL;
> + (*grad)->blendcount = 1;
> + (*grad)->surroundcolors = NULL;
>
> (*grad)->pathdata.Count = count;
> (*grad)->pathdata.Points = GdipAlloc(count * sizeof(PointF));
> @@ -946,6 +947,7 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush)
> GdipFree(((GpPathGradient*) brush)->pathdata.Types);
> GdipFree(((GpPathGradient*) brush)->blendfac);
> GdipFree(((GpPathGradient*) brush)->blendpos);
> + GdipFree(((GpPathGradient*) brush)->surroundcolors);
> break;
> case BrushTypeSolidColor:
> if (((GpSolidFill*)brush)->bmp)
> @@ -1174,7 +1176,9 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient *brush,
> if (!brush || !count)
> return InvalidParameter;
>
> - return NotImplemented;
> + *count = brush->surroundcolorcount;
> +
> + return Ok;
> }
>
> GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush,
> @@ -1544,7 +1548,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad,
> GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
> *grad, GDIPCONST ARGB *argb, INT *count)
> {
> - static int calls;
> + ARGB *new_colors;
>
> TRACE("(%p,%p,%p)\n", grad, argb, count);
>
> @@ -1552,10 +1556,17 @@ GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
> (*count > grad->pathdata.Count))
> return InvalidParameter;
>
> - if(!(calls++))
> - FIXME("not implemented\n");
> + new_colors = GdipAlloc(*count * sizeof(ARGB));
> + if (!new_colors) return OutOfMemory;
>
> - return NotImplemented;
> + memcpy(new_colors, argb, *count * sizeof(ARGB));
> +
> + GdipFree(grad->surroundcolors);
> +
> + grad->surroundcolorcount = *count;
> + grad->surroundcolors = new_colors;
> +
> + return Ok;
> }
>
> GpStatus WINGDIPAPI GdipSetPathGradientWrapMode(GpPathGradient *grad,
> diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
> index ca1cba6..eddde11 100644
> --- a/dlls/gdiplus/gdiplus_private.h
> +++ b/dlls/gdiplus/gdiplus_private.h
> @@ -151,6 +151,8 @@ struct GpPathGradient{
> GpBrush brush;
> PathData pathdata;
> ARGB centercolor;
> + INT surroundcolorcount;
> + ARGB* surroundcolors;
> GpWrapMode wrap;
> BOOL gamma;
> GpPointF center;
> diff --git a/dlls/gdiplus/tests/brush.c b/dlls/gdiplus/tests/brush.c
> index 0effcf4..820cb4e 100644
> --- a/dlls/gdiplus/tests/brush.c
> +++ b/dlls/gdiplus/tests/brush.c
> @@ -683,7 +683,7 @@ static void test_gradientsurroundcolorcount(void)
> }
>
> status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count);
> - todo_wine expect(Ok, status);
> + expect(Ok, status);
> expect(2, count);
>
> status = GdipGetPathGradientSurroundColorCount(NULL, &count);
> @@ -694,8 +694,8 @@ static void test_gradientsurroundcolorcount(void)
>
> count = 0;
> status = GdipGetPathGradientSurroundColorCount(grad, &count);
> - todo_wine expect(Ok, status);
> - todo_wine expect(2, count);
> + expect(Ok, status);
> + expect(2, count);
>
> GdipFree(color);
> GdipDeleteBrush((GpBrush*)grad);
> --
> 1.6.5.rc1
>
>
>
>