Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1366)

Unified Diff: third_party/WebKit/Source/core/css/CSSGradientValue.cpp

Issue 1915763002: CSS conic gradient (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/CSSGradientValue.cpp
diff --git a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
index 32f7a3546eb6ebf8412f6d717dd472c7fe6b8e2c..1b0e22dae9e3c47a657e04097b91d5c75dfbc28a 100644
--- a/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSGradientValue.cpp
@@ -72,10 +72,20 @@ PassRefPtr<Image> CSSGradientValue::image(const LayoutObject& layoutObject, cons
const ComputedStyle* rootStyle = layoutObject.document().documentElement()->computedStyle();
CSSToLengthConversionData conversionData(layoutObject.style(), rootStyle, layoutObject.view(), layoutObject.style()->effectiveZoom());
- if (isLinearGradientValue())
+
+ switch (getClassType()) {
+ case LinearGradientClass:
gradient = toCSSLinearGradientValue(this)->createGradient(conversionData, size, layoutObject);
- else
+ break;
+ case RadialGradientClass:
gradient = toCSSRadialGradientValue(this)->createGradient(conversionData, size, layoutObject);
+ break;
+ case ConicGradientClass:
+ gradient = toCSSConicGradientValue(this)->createGradient(conversionData, size, layoutObject);
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
RefPtr<Image> newImage = GradientGeneratedImage::create(gradient, size);
if (cacheable)
@@ -461,7 +471,7 @@ void CSSGradientValue::addStops(Gradient* gradient, const CSSToLengthConversionD
// Negative offsets are only an issue for non-repeating radial gradients: linear gradient
// points can be repositioned arbitrarily, and for repeating radial gradients we shift
// the radii into equivalent positive values.
- if (isRadialGradientValue() && !m_repeating)
+ if ((isRadialGradientValue() && !m_repeating) || isConicGradientValue())
clampNegativeOffsets(stops);
if (normalizeAndAddStops(stops, gradient)) {
@@ -1222,4 +1232,43 @@ DEFINE_TRACE_AFTER_DISPATCH(CSSRadialGradientValue)
CSSGradientValue::traceAfterDispatch(visitor);
}
+String CSSConicGradientValue::customCSSText() const
+{
+ StringBuilder result;
+
+ return result.toString();
+}
+
+PassRefPtr<Gradient> CSSConicGradientValue::createGradient(const CSSToLengthConversionData& conversionData, const IntSize& size, const LayoutObject& object)
+{
+ ASSERT(!size.isEmpty());
+
+ FloatPoint point = computeEndPoint(m_firstX.get(), m_firstY.get(), conversionData, size);
+ if (!m_firstX)
+ point.setX(size.width() / 2);
+ if (!m_firstY)
+ point.setY(size.height() / 2);
+
+ RefPtr<Gradient> gradient = Gradient::create(point, 0); // TODO: angle
+ gradient->setSpreadMethod(m_repeating ? SpreadMethodRepeat : SpreadMethodPad);
+ gradient->setDrawsInPMColorSpace(true);
+
+ addStops(gradient.get(), conversionData, object);
+
+ return gradient.release();
+}
+
+bool CSSConicGradientValue::equals(const CSSConicGradientValue& other) const
+{
+
+ return compareCSSValuePtr(m_firstX, other.m_firstX)
+ && compareCSSValuePtr(m_firstY, other.m_firstY)
+ && m_stops == other.m_stops;
+}
+
+DEFINE_TRACE_AFTER_DISPATCH(CSSConicGradientValue)
+{
+ CSSGradientValue::traceAfterDispatch(visitor);
+}
+
} // namespace blink
« no previous file with comments | « third_party/WebKit/Source/core/css/CSSGradientValue.h ('k') | third_party/WebKit/Source/core/css/CSSImageGeneratorValue.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698