diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-24 17:03:20 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-07-24 17:03:20 +0200 |
commit | 08d4a74d56ca431877819fc4566e27eafe150342 (patch) | |
tree | ebd8530838ab390c015c6b7e659a22852c1663ae /Source/WebCore/css/CSSGradientValue.cpp | |
parent | 1de6cd4794bbd5a52189384189a2b8df1848b39b (diff) | |
download | qtwebkit-08d4a74d56ca431877819fc4566e27eafe150342.tar.gz |
Imported WebKit commit 0fbd41c4e13f5a190faf160bf993eee614e6e18e (http://svn.webkit.org/repository/webkit/trunk@123477)
New snapshot that adapts to latest Qt API changes
Diffstat (limited to 'Source/WebCore/css/CSSGradientValue.cpp')
-rw-r--r-- | Source/WebCore/css/CSSGradientValue.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/Source/WebCore/css/CSSGradientValue.cpp b/Source/WebCore/css/CSSGradientValue.cpp index a314a8602..3f1979fee 100644 --- a/Source/WebCore/css/CSSGradientValue.cpp +++ b/Source/WebCore/css/CSSGradientValue.cpp @@ -105,6 +105,34 @@ struct GradientStop { { } }; +PassRefPtr<CSSGradientValue> CSSGradientValue::gradientWithStylesResolved(StyleResolver* styleResolver) +{ + bool derived = false; + for (unsigned i = 0; i < m_stops.size(); i++) + if (styleResolver->colorFromPrimitiveValueIsDerivedFromElement(m_stops[i].m_color.get())) { + m_stops[i].m_colorIsDerivedFromElement = true; + derived = true; + break; + } + + RefPtr<CSSGradientValue> result; + if (!derived) + result = this; + else if (isLinearGradient()) + result = static_cast<CSSLinearGradientValue*>(this)->clone(); + else if (isRadialGradient()) + result = static_cast<CSSRadialGradientValue*>(this)->clone(); + else { + ASSERT_NOT_REACHED(); + return 0; + } + + for (unsigned i = 0; i < result->m_stops.size(); i++) + result->m_stops[i].m_resolvedColor = styleResolver->colorFromPrimitiveValue(result->m_stops[i].m_color.get()); + + return result.release(); +} + void CSSGradientValue::addStops(Gradient* gradient, RenderObject* renderer, RenderStyle* rootStyle, float maxLengthForRepeat) { RenderStyle* style = renderer->style(); @@ -112,10 +140,8 @@ void CSSGradientValue::addStops(Gradient* gradient, RenderObject* renderer, Rend if (m_deprecatedType) { sortStopsIfNeeded(); - // We have to resolve colors. for (unsigned i = 0; i < m_stops.size(); i++) { const CSSGradientColorStop& stop = m_stops[i]; - Color color = renderer->document()->styleResolver()->colorFromPrimitiveValue(stop.m_color.get()); float offset; if (stop.m_position->isPercentage()) @@ -123,7 +149,7 @@ void CSSGradientValue::addStops(Gradient* gradient, RenderObject* renderer, Rend else offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_NUMBER); - gradient->addColorStop(offset, color); + gradient->addColorStop(offset, stop.m_resolvedColor); } // The back end already sorted the stops. @@ -148,7 +174,7 @@ void CSSGradientValue::addStops(Gradient* gradient, RenderObject* renderer, Rend for (size_t i = 0; i < numStops; ++i) { const CSSGradientColorStop& stop = m_stops[i]; - stops[i].color = renderer->document()->styleResolver()->colorFromPrimitiveValue(stop.m_color.get()); + stops[i].color = stop.m_resolvedColor; if (stop.m_position) { if (stop.m_position->isPercentage()) @@ -413,8 +439,7 @@ bool CSSGradientValue::isCacheable() const for (size_t i = 0; i < m_stops.size(); ++i) { const CSSGradientColorStop& stop = m_stops[i]; - CSSPrimitiveValue* color = stop.m_color.get(); - if (color->getIdent() == CSSValueCurrentcolor) + if (stop.m_colorIsDerivedFromElement) return false; if (!stop.m_position) |