Vincent Povirk : gdiplus: Implement GdipSetPathGradientBlend, with tests.

Alexandre Julliard julliard at winehq.org
Wed Apr 25 13:40:25 CDT 2012


Module: wine
Branch: master
Commit: b66fd44080b3a78d68f5dbe73005141b3f71bc67
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b66fd44080b3a78d68f5dbe73005141b3f71bc67

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Tue Apr 24 09:44:43 2012 -0500

gdiplus: Implement GdipSetPathGradientBlend, with tests.

---

 dlls/gdiplus/brush.c       |   29 ++++++++++--
 dlls/gdiplus/tests/brush.c |  105 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 130 insertions(+), 4 deletions(-)

diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c
index b05d74a..5c82064 100644
--- a/dlls/gdiplus/brush.c
+++ b/dlls/gdiplus/brush.c
@@ -1432,14 +1432,35 @@ GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient *line,
 GpStatus WINGDIPAPI GdipSetPathGradientBlend(GpPathGradient *brush, GDIPCONST REAL *blend,
     GDIPCONST REAL *pos, INT count)
 {
-    static int calls;
+    REAL *new_blendfac, *new_blendpos;
 
     TRACE("(%p,%p,%p,%i)\n", brush, blend, pos, count);
 
-    if(!(calls++))
-        FIXME("not implemented\n");
+    if(!brush || !blend || !pos || count <= 0 ||
+       (count >= 2 && (pos[0] != 0.0f || pos[count-1] != 1.0f)))
+        return InvalidParameter;
 
-    return NotImplemented;
+    new_blendfac = GdipAlloc(count * sizeof(REAL));
+    new_blendpos = GdipAlloc(count * sizeof(REAL));
+
+    if (!new_blendfac || !new_blendpos)
+    {
+        GdipFree(new_blendfac);
+        GdipFree(new_blendpos);
+        return OutOfMemory;
+    }
+
+    memcpy(new_blendfac, blend, count * sizeof(REAL));
+    memcpy(new_blendpos, pos, count * sizeof(REAL));
+
+    GdipFree(brush->blendfac);
+    GdipFree(brush->blendpos);
+
+    brush->blendcount = count;
+    brush->blendfac = new_blendfac;
+    brush->blendpos = new_blendpos;
+
+    return Ok;
 }
 
 GpStatus WINGDIPAPI GdipSetPathGradientLinearBlend(GpPathGradient *brush,
diff --git a/dlls/gdiplus/tests/brush.c b/dlls/gdiplus/tests/brush.c
index bf74abd..354d60d 100644
--- a/dlls/gdiplus/tests/brush.c
+++ b/dlls/gdiplus/tests/brush.c
@@ -1133,6 +1133,110 @@ static void test_pathgradientpresetblend(void)
     expect(Ok, status);
 }
 
+static void test_pathgradientblend(void)
+{
+    static const GpPointF path_points[] = {{0,0}, {3,0}, {0,4}};
+    GpPathGradient *brush;
+    GpStatus status;
+    INT count, i;
+    const REAL factors[5] = {0.0f, 0.1f, 0.5f, 0.9f, 1.0f};
+    const REAL positions[5] = {0.0f, 0.2f, 0.5f, 0.8f, 1.0f};
+    REAL res_factors[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f};
+    REAL res_positions[6] = {0.3f, 0.0f, 0.0f, 0.0f, 0.0f};
+
+    status = GdipCreatePathGradient(path_points, 3, WrapModeClamp, &brush);
+    expect(Ok, status);
+
+    status = GdipGetPathGradientBlendCount(NULL, &count);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlendCount(brush, NULL);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlendCount(brush, &count);
+    expect(Ok, status);
+    expect(1, count);
+
+    status = GdipGetPathGradientBlend(NULL, res_factors, res_positions, 1);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlend(brush, NULL, res_positions, 1);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, NULL, 1);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 0);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, -1);
+    expect(InvalidParameter, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 1);
+    expect(Ok, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 2);
+    expect(Ok, status);
+
+    status = GdipSetPathGradientBlend(NULL, factors, positions, 5);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPathGradientBlend(brush, NULL, positions, 5);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPathGradientBlend(brush, factors, NULL, 5);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPathGradientBlend(brush, factors, positions, 0);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPathGradientBlend(brush, factors, positions, -1);
+    expect(InvalidParameter, status);
+
+    /* leave off the 0.0 position */
+    status = GdipSetPathGradientBlend(brush, &factors[1], &positions[1], 4);
+    expect(InvalidParameter, status);
+
+    /* leave off the 1.0 position */
+    status = GdipSetPathGradientBlend(brush, factors, positions, 4);
+    expect(InvalidParameter, status);
+
+    status = GdipSetPathGradientBlend(brush, factors, positions, 5);
+    expect(Ok, status);
+
+    status = GdipGetPathGradientBlendCount(brush, &count);
+    expect(Ok, status);
+    expect(5, count);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 4);
+    expect(InsufficientBuffer, status);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 5);
+    expect(Ok, status);
+
+    for (i=0; i<5; i++)
+    {
+        expectf(factors[i], res_factors[i]);
+        expectf(positions[i], res_positions[i]);
+    }
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 6);
+    expect(Ok, status);
+
+    status = GdipSetPathGradientBlend(brush, factors, positions, 1);
+    expect(Ok, status);
+
+    status = GdipGetPathGradientBlendCount(brush, &count);
+    expect(Ok, status);
+    expect(1, count);
+
+    status = GdipGetPathGradientBlend(brush, res_factors, res_positions, 1);
+    expect(Ok, status);
+
+    status = GdipDeleteBrush((GpBrush*)brush);
+    expect(Ok, status);
+}
+
 START_TEST(brush)
 {
     struct GdiplusStartupInput gdiplusStartupInput;
@@ -1160,6 +1264,7 @@ START_TEST(brush)
     test_pathgradientpath();
     test_pathgradientcenterpoint();
     test_pathgradientpresetblend();
+    test_pathgradientblend();
 
     GdiplusShutdown(gdiplusToken);
 }




More information about the wine-cvs mailing list