gdiplus: Store only one surround color if all colors are the same.

This commit is contained in:
Vincent Povirk 2012-04-24 10:14:35 -05:00 committed by Alexandre Julliard
parent 8273d58a96
commit e2b59a87b0
2 changed files with 48 additions and 3 deletions

View File

@ -1699,6 +1699,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
*grad, GDIPCONST ARGB *argb, INT *count)
{
ARGB *new_surroundcolors;
INT i, num_colors;
TRACE("(%p,%p,%p)\n", grad, argb, count);
@ -1706,16 +1707,29 @@ GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient
(*count > grad->path->pathdata.Count))
return InvalidParameter;
new_surroundcolors = GdipAlloc(*count * sizeof(ARGB));
num_colors = *count;
/* If all colors are the same, only store 1 color. */
if (*count > 1)
{
for (i=1; i < num_colors; i++)
if (argb[i] != argb[i-1])
break;
if (i == num_colors)
num_colors = 1;
}
new_surroundcolors = GdipAlloc(num_colors * sizeof(ARGB));
if (!new_surroundcolors)
return OutOfMemory;
memcpy(new_surroundcolors, argb, *count * sizeof(ARGB));
memcpy(new_surroundcolors, argb, num_colors * sizeof(ARGB));
GdipFree(grad->surroundcolors);
grad->surroundcolors = new_surroundcolors;
grad->surroundcolorcount = *count;
grad->surroundcolorcount = num_colors;
return Ok;
}

View File

@ -876,6 +876,37 @@ static void test_gradientsurroundcolorcount(void)
expect(Ok, status);
expect(2, count);
/* If all colors are the same, count is set to 1. */
color[0] = color[1] = 0;
count = 2;
status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count);
expect(Ok, status);
expect(2, count);
color[0] = color[1] = color[2] = 0xdeadbeef;
count = 2;
status = GdipGetPathGradientSurroundColorsWithCount(grad, color, &count);
expect(Ok, status);
expect(1, count);
expect(0x00000000, color[0]);
expect(0x00000000, color[1]);
expect(0xdeadbeef, color[2]);
color[0] = color[1] = 0xff00ff00;
count = 2;
status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count);
expect(Ok, status);
expect(2, count);
color[0] = color[1] = color[2] = 0xdeadbeef;
count = 2;
status = GdipGetPathGradientSurroundColorsWithCount(grad, color, &count);
expect(Ok, status);
expect(1, count);
expect(0xff00ff00, color[0]);
expect(0xff00ff00, color[1]);
expect(0xdeadbeef, color[2]);
count = 0;
status = GdipSetPathGradientSurroundColorsWithCount(grad, color, &count);
expect(InvalidParameter, status);