diff options
author | mmoss@google.com <mmoss@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-12 17:14:56 +0000 |
---|---|---|
committer | mmoss@google.com <mmoss@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2008-12-12 17:14:56 +0000 |
commit | 6c261442dfbe22a447f0b26308c9278afdf9b57a (patch) | |
tree | c0ca59d50dc9aa76c083e815ef441fbbba15d430 /webkit/port/platform | |
parent | 579776669a98ccd550bbee50c3eea37fbea1dc3f (diff) | |
download | chromium_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.cpp | 14 |
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) {
|