[PATCH 3/3] gdiplus: Implement GdipSetPathGradientSurroundColorsWithCount and GdipGetPathGradientSurroundColorCount [Try 2]

Vincent Povirk madewokherd+8cd9 at gmail.com
Sun Mar 28 23:58:36 CDT 2010


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 at 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
>
>
>
>



More information about the wine-devel mailing list