Vincent Povirk : gdiplus: Use the preset blend when drawing linear gradients.

Alexandre Julliard julliard at winehq.org
Tue Sep 15 17:47:58 CDT 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Mon Sep 14 16:48:03 2009 -0500

gdiplus: Use the preset blend when drawing linear gradients.

---

 dlls/gdiplus/graphics.c |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)

diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index 6753262..df107e4 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -220,7 +220,27 @@ static ARGB blend_line_gradient(GpLineGradient* brush, REAL position)
         blendfac = (left_blendfac * (right_blendpos - position) +
                     right_blendfac * (position - left_blendpos)) / range;
     }
-    return blend_colors(brush->startcolor, brush->endcolor, blendfac);
+
+    if (brush->pblendcount == 0)
+        return blend_colors(brush->startcolor, brush->endcolor, blendfac);
+    else
+    {
+        int i=1;
+        ARGB left_blendcolor, right_blendcolor;
+        REAL left_blendpos, right_blendpos;
+
+        /* locate the blend colors surrounding this position */
+        while (blendfac > brush->pblendpos[i])
+            i++;
+
+        /* interpolate between the blend colors */
+        left_blendpos = brush->pblendpos[i-1];
+        left_blendcolor = brush->pblendcolor[i-1];
+        right_blendpos = brush->pblendpos[i];
+        right_blendcolor = brush->pblendcolor[i];
+        blendfac = (blendfac - left_blendpos) / (right_blendpos - left_blendpos);
+        return blend_colors(left_blendcolor, right_blendcolor, blendfac);
+    }
 }
 
 static void brush_fill_path(GpGraphics *graphics, GpBrush* brush)




More information about the wine-cvs mailing list