Index: Source/core/css/CSSGradientValue.cpp |
diff --git a/Source/core/css/CSSGradientValue.cpp b/Source/core/css/CSSGradientValue.cpp |
index 03479afd02eb0e92a6ebc72ca90a9c46f6c6817d..1b048ece7a40da7a84ca5a1f9ac8af8b4cc35168 100644 |
--- a/Source/core/css/CSSGradientValue.cpp |
+++ b/Source/core/css/CSSGradientValue.cpp |
@@ -114,38 +114,7 @@ public: |
{ } |
}; |
-PassRefPtrWillBeRawPtr<CSSGradientValue> CSSGradientValue::gradientWithStylesResolved(const TextLinkColors& textLinkColors, Color currentColor) |
-{ |
- bool derived = false; |
- for (auto& stop : m_stops) { |
- if (!stop.isHint() && stop.m_color->colorIsDerivedFromElement()) { |
- stop.m_colorIsDerivedFromElement = true; |
- derived = true; |
- break; |
- } |
- } |
- |
- RefPtrWillBeRawPtr<CSSGradientValue> result = nullptr; |
- if (!derived) |
- result = this; |
- else if (isLinearGradientValue()) |
- result = toCSSLinearGradientValue(this)->clone(); |
- else if (isRadialGradientValue()) |
- result = toCSSRadialGradientValue(this)->clone(); |
- else { |
- ASSERT_NOT_REACHED(); |
- return nullptr; |
- } |
- |
- for (auto& stop : result->m_stops) { |
- if (!stop.isHint()) |
- stop.m_resolvedColor = textLinkColors.colorFromPrimitiveValue(stop.m_color.get(), currentColor); |
- } |
- |
- return result.release(); |
-} |
- |
-static void replaceColorHintsWithColorStops(WillBeHeapVector<GradientStop>& stops, const WillBeHeapVector<CSSGradientColorStop, 2>& cssGradientStops) |
+void replaceColorHintsWithColorStops(WillBeHeapVector<GradientStop>& stops, const WillBeHeapVector<CSSGradientColorStop, 2>& cssGradientStops) |
{ |
// This algorithm will replace each color interpolation hint with 9 regular |
// color stops. The color values for the new color stops will be calculated |
@@ -233,6 +202,11 @@ static void replaceColorHintsWithColorStops(WillBeHeapVector<GradientStop>& stop |
} |
} |
+static Color resolveStopColor(CSSPrimitiveValue* stopColor, const RenderObject& object) |
+{ |
+ return object.document().textLinkColors().colorFromPrimitiveValue(stopColor, object.resolveColor(CSSPropertyColor)); |
+} |
+ |
void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionData& conversionData, float maxLengthForRepeat, const RenderObject& object) |
{ |
if (m_gradientType == CSSDeprecatedLinearGradient || m_gradientType == CSSDeprecatedRadialGradient) { |
@@ -247,7 +221,7 @@ void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD |
else |
offset = stop.m_position->getFloatValue(CSSPrimitiveValue::CSS_NUMBER); |
- gradient->addColorStop(offset, stop.m_resolvedColor); |
+ gradient->addColorStop(offset, resolveStopColor(stop.m_color.get(), object)); |
} |
return; |
@@ -275,7 +249,7 @@ void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD |
if (stop.isHint()) |
hasHints = true; |
else |
- stops[i].color = object.document().textLinkColors().colorFromPrimitiveValue(stop.m_color.get(), object.style()->visitedDependentColor(CSSPropertyColor)); |
+ stops[i].color = resolveStopColor(stop.m_color.get(), object); |
if (stop.m_position) { |
if (stop.m_position->isPercentage()) |
@@ -559,7 +533,7 @@ bool CSSGradientValue::isCacheable() const |
for (size_t i = 0; i < m_stops.size(); ++i) { |
const CSSGradientColorStop& stop = m_stops[i]; |
- if (stop.m_colorIsDerivedFromElement) |
+ if (!stop.isHint() && stop.m_color->colorIsDerivedFromElement()) |
return false; |
if (!stop.m_position) |
@@ -572,10 +546,11 @@ bool CSSGradientValue::isCacheable() const |
return true; |
} |
-bool CSSGradientValue::knownToBeOpaque(const RenderObject*) const |
+bool CSSGradientValue::knownToBeOpaque(const RenderObject* object) const |
{ |
+ ASSERT(object); |
for (auto& stop : m_stops) { |
- if (!stop.isHint() && stop.m_resolvedColor.hasAlpha()) |
+ if (!stop.isHint() && resolveStopColor(stop.m_color.get(), *object).hasAlpha()) |
return false; |
} |
return true; |