summaryrefslogtreecommitdiff
path: root/Source/WebCore/css/CSSGradientValue.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-07-24 17:03:20 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-07-24 17:03:20 +0200
commit08d4a74d56ca431877819fc4566e27eafe150342 (patch)
treeebd8530838ab390c015c6b7e659a22852c1663ae /Source/WebCore/css/CSSGradientValue.cpp
parent1de6cd4794bbd5a52189384189a2b8df1848b39b (diff)
downloadqtwebkit-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.cpp37
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)