summaryrefslogtreecommitdiffstats
path: root/webkit/port/platform
diff options
context:
space:
mode:
authormmoss@google.com <mmoss@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 17:14:56 +0000
committermmoss@google.com <mmoss@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 17:14:56 +0000
commit6c261442dfbe22a447f0b26308c9278afdf9b57a (patch)
treec0ca59d50dc9aa76c083e815ef441fbbba15d430 /webkit/port/platform
parent579776669a98ccd550bbee50c3eea37fbea1dc3f (diff)
downloadchromium_src-6c261442dfbe22a447f0b26308c9278afdf9b57a.zip
chromium_src-6c261442dfbe22a447f0b26308c9278afdf9b57a.tar.gz
chromium_src-6c261442dfbe22a447f0b26308c9278afdf9b57a.tar.bz2
Sort gradient stops before processing.
This fixes: LayoutTests/fast/canvas/gradient-add-second-start-end-stop.html Review URL: http://codereview.chromium.org/14044 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6893 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/port/platform')
-rw-r--r--webkit/port/platform/graphics/skia/GradientSkia.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/webkit/port/platform/graphics/skia/GradientSkia.cpp b/webkit/port/platform/graphics/skia/GradientSkia.cpp
index 62ae1ed..8a5c7c0 100644
--- a/webkit/port/platform/graphics/skia/GradientSkia.cpp
+++ b/webkit/port/platform/graphics/skia/GradientSkia.cpp
@@ -103,6 +103,11 @@ static void fill_stops(const Gradient::ColorStop* stopData,
}
}
+static inline bool compareStops(const Gradient::ColorStop& a, const Gradient::ColorStop& b)
+{
+ return a.stop < b.stop;
+}
+
SkShader* Gradient::platformGradient()
{
if (m_gradient)
@@ -116,7 +121,14 @@ SkShader* Gradient::platformGradient()
SkAutoMalloc storage(count_used * (sizeof(SkColor) + sizeof(SkScalar)));
SkColor* colors = (SkColor*)storage.get();
SkScalar* pos = (SkScalar*)(colors + count_used);
-
+
+ // TODO: This and compareStops() are also in Gradient.cpp and
+ // CSSGradientValue.cpp; probably should refactor in WebKit.
+ if (!m_stopsSorted) {
+ if (m_stops.size())
+ std::stable_sort(m_stops.begin(), m_stops.end(), compareStops);
+ m_stopsSorted = true;
+ }
fill_stops(m_stops.data(), m_stops.size(), pos, colors);
if (m_radial) {