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

Unified Diff: third_party/WebKit/Source/core/svg/SVGLinearGradientElement.cpp

Issue 2741993002: Move common gradient attribute collection to SVGGradientElement (Closed)
Patch Set: Rebase; fix semantics on find cycle Created 3 years, 9 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/svg/SVGLinearGradientElement.cpp
diff --git a/third_party/WebKit/Source/core/svg/SVGLinearGradientElement.cpp b/third_party/WebKit/Source/core/svg/SVGLinearGradientElement.cpp
index 2ee5e0431c330ffad896821db12395ce33e86116..ded7f5b769a43f71395555ca5cb65a24d83130ba 100644
--- a/third_party/WebKit/Source/core/svg/SVGLinearGradientElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGLinearGradientElement.cpp
@@ -94,81 +94,47 @@ LayoutObject* SVGLinearGradientElement::createLayoutObject(
return new LayoutSVGResourceLinearGradient(this);
}
-static void setGradientAttributes(SVGGradientElement* element,
+static void setGradientAttributes(const SVGGradientElement& element,
LinearGradientAttributes& attributes,
- bool isLinear = true) {
- if (!attributes.hasSpreadMethod() && element->spreadMethod()->isSpecified())
- attributes.setSpreadMethod(
- element->spreadMethod()->currentValue()->enumValue());
-
- if (!attributes.hasGradientUnits() && element->gradientUnits()->isSpecified())
- attributes.setGradientUnits(
- element->gradientUnits()->currentValue()->enumValue());
-
- if (!attributes.hasGradientTransform() &&
- element->hasTransform(SVGElement::ExcludeMotionTransform)) {
- attributes.setGradientTransform(
- element->calculateTransform(SVGElement::ExcludeMotionTransform));
- }
-
- if (!attributes.hasStops()) {
- const Vector<Gradient::ColorStop>& stops(element->buildStops());
- if (!stops.isEmpty())
- attributes.setStops(stops);
- }
+ bool isLinear) {
+ element.collectCommonAttributes(attributes);
- if (isLinear) {
- SVGLinearGradientElement* linear = toSVGLinearGradientElement(element);
+ if (!isLinear)
+ return;
+ const SVGLinearGradientElement& linear = toSVGLinearGradientElement(element);
- if (!attributes.hasX1() && linear->x1()->isSpecified())
- attributes.setX1(linear->x1()->currentValue());
+ if (!attributes.hasX1() && linear.x1()->isSpecified())
+ attributes.setX1(linear.x1()->currentValue());
- if (!attributes.hasY1() && linear->y1()->isSpecified())
- attributes.setY1(linear->y1()->currentValue());
+ if (!attributes.hasY1() && linear.y1()->isSpecified())
+ attributes.setY1(linear.y1()->currentValue());
- if (!attributes.hasX2() && linear->x2()->isSpecified())
- attributes.setX2(linear->x2()->currentValue());
+ if (!attributes.hasX2() && linear.x2()->isSpecified())
+ attributes.setX2(linear.x2()->currentValue());
- if (!attributes.hasY2() && linear->y2()->isSpecified())
- attributes.setY2(linear->y2()->currentValue());
- }
+ if (!attributes.hasY2() && linear.y2()->isSpecified())
+ attributes.setY2(linear.y2()->currentValue());
}
bool SVGLinearGradientElement::collectGradientAttributes(
LinearGradientAttributes& attributes) {
- if (!layoutObject())
- return false;
-
- HeapHashSet<Member<SVGGradientElement>> processedGradients;
- SVGGradientElement* current = this;
+ DCHECK(layoutObject());
- setGradientAttributes(current, attributes);
- processedGradients.insert(current);
+ VisitedSet visited;
+ const SVGGradientElement* current = this;
while (true) {
- // Respect xlink:href, take attributes from referenced element
- Node* refNode = SVGURIReference::targetElementFromIRIString(
- current->href()->currentValue()->value(), treeScope());
- if (refNode && isSVGGradientElement(*refNode)) {
- current = toSVGGradientElement(refNode);
-
- // Cycle detection
- if (processedGradients.contains(current))
- return true;
-
- if (!current->layoutObject())
- return false;
-
- setGradientAttributes(current, attributes,
- isSVGLinearGradientElement(*current));
- processedGradients.insert(current);
- } else {
- return true;
- }
+ setGradientAttributes(*current, attributes,
+ isSVGLinearGradientElement(*current));
+ visited.insert(current);
+
+ current = current->referencedElement();
+ if (!current || visited.contains(current))
+ break;
+ if (!current->layoutObject())
+ return false;
}
-
- ASSERT_NOT_REACHED();
- return false;
+ return true;
}
bool SVGLinearGradientElement::selfHasRelativeLengths() const {

Powered by Google App Engine
This is Rietveld 408576698