[PATCH 3/3] gdiplus: Implement GdipSetPathGradientSurroundColorsWithCount and GdipGetPathGradientSurroundColorCount [Try 2]
Justin Chevrier
jchevrier at gmail.com
Sun Mar 28 23:22:22 CDT 2010
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-patches
mailing list