Chromium Code Reviews| Index: Source/core/svg/SVGPatternElement.cpp |
| diff --git a/Source/core/svg/SVGPatternElement.cpp b/Source/core/svg/SVGPatternElement.cpp |
| index d54cf96a043896603070ad34d5e7789f64f42d45..3955d573e8c9da9eaa11045859ad563526a93328 100644 |
| --- a/Source/core/svg/SVGPatternElement.cpp |
| +++ b/Source/core/svg/SVGPatternElement.cpp |
| @@ -166,45 +166,49 @@ RenderObject* SVGPatternElement::createRenderer(RenderStyle*) |
| return new RenderSVGResourcePattern(this); |
| } |
| -void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes) const |
| +static void setPatternAttributes(const SVGPatternElement* element, PatternAttributes& attributes) |
| { |
| - HashSet<const SVGPatternElement*> processedPatterns; |
| + if (!attributes.hasX() && element->hasAttribute(SVGNames::xAttr)) |
| + attributes.setX(element->x()->currentValue()); |
| - const SVGPatternElement* current = this; |
| - while (current) { |
| - if (!attributes.hasX() && current->hasAttribute(SVGNames::xAttr)) |
| - attributes.setX(current->x()->currentValue()); |
| + if (!attributes.hasY() && element->hasAttribute(SVGNames::yAttr)) |
| + attributes.setY(element->y()->currentValue()); |
| - if (!attributes.hasY() && current->hasAttribute(SVGNames::yAttr)) |
| - attributes.setY(current->y()->currentValue()); |
| + if (!attributes.hasWidth() && element->hasAttribute(SVGNames::widthAttr)) |
| + attributes.setWidth(element->width()->currentValue()); |
| - if (!attributes.hasWidth() && current->hasAttribute(SVGNames::widthAttr)) |
| - attributes.setWidth(current->width()->currentValue()); |
| + if (!attributes.hasHeight() && element->hasAttribute(SVGNames::heightAttr)) |
| + attributes.setHeight(element->height()->currentValue()); |
| - if (!attributes.hasHeight() && current->hasAttribute(SVGNames::heightAttr)) |
| - attributes.setHeight(current->height()->currentValue()); |
| + if (!attributes.hasViewBox() && element->hasAttribute(SVGNames::viewBoxAttr) && element->viewBox()->currentValue()->isValid()) |
| + attributes.setViewBox(element->viewBox()->currentValue()->value()); |
| - if (!attributes.hasViewBox() && current->hasAttribute(SVGNames::viewBoxAttr) && current->viewBox()->currentValue()->isValid()) |
| - attributes.setViewBox(current->viewBox()->currentValue()->value()); |
| + if (!attributes.hasPreserveAspectRatio() && element->hasAttribute(SVGNames::preserveAspectRatioAttr)) |
| + attributes.setPreserveAspectRatio(element->preserveAspectRatioCurrentValue()); |
| - if (!attributes.hasPreserveAspectRatio() && current->hasAttribute(SVGNames::preserveAspectRatioAttr)) |
| - attributes.setPreserveAspectRatio(current->preserveAspectRatioCurrentValue()); |
| + if (!attributes.hasPatternUnits() && element->hasAttribute(SVGNames::patternUnitsAttr)) |
| + attributes.setPatternUnits(element->patternUnitsCurrentValue()); |
| - if (!attributes.hasPatternUnits() && current->hasAttribute(SVGNames::patternUnitsAttr)) |
| - attributes.setPatternUnits(current->patternUnitsCurrentValue()); |
| + if (!attributes.hasPatternContentUnits() && element->hasAttribute(SVGNames::patternContentUnitsAttr)) |
| + attributes.setPatternContentUnits(element->patternContentUnitsCurrentValue()); |
| - if (!attributes.hasPatternContentUnits() && current->hasAttribute(SVGNames::patternContentUnitsAttr)) |
| - attributes.setPatternContentUnits(current->patternContentUnitsCurrentValue()); |
| + if (!attributes.hasPatternTransform() && element->hasAttribute(SVGNames::patternTransformAttr)) { |
| + AffineTransform transform; |
| + element->patternTransformCurrentValue().concatenate(transform); |
| + attributes.setPatternTransform(transform); |
| + } |
| - if (!attributes.hasPatternTransform() && current->hasAttribute(SVGNames::patternTransformAttr)) { |
| - AffineTransform transform; |
| - current->patternTransformCurrentValue().concatenate(transform); |
| - attributes.setPatternTransform(transform); |
| - } |
| + if (!attributes.hasPatternContentElement() && element->childElementCount()) |
| + attributes.setPatternContentElement(element); |
| +} |
| - if (!attributes.hasPatternContentElement() && current->childElementCount()) |
| - attributes.setPatternContentElement(current); |
| +void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes) const |
| +{ |
| + HashSet<const SVGPatternElement*> processedPatterns; |
| + const SVGPatternElement* current = this; |
| + while (true) { |
| + setPatternAttributes(current, attributes); |
| processedPatterns.add(current); |
| // Respect xlink:href, take attributes from referenced element |
| @@ -213,13 +217,14 @@ void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes) |
| current = toSVGPatternElement(const_cast<const Node*>(refNode)); |
| // Cycle detection |
| - if (processedPatterns.contains(current)) { |
| - current = 0; |
| - break; |
| - } |
| - } else |
| - current = 0; |
| + if (processedPatterns.contains(current)) |
| + return; |
|
pdr.
2014/01/21 00:33:26
I actually think this is harder to follow as there
|
| + } else { |
| + return; |
| + } |
| } |
| + |
| + ASSERT_NOT_REACHED(); |
| } |
| AffineTransform SVGPatternElement::localCoordinateSpaceTransform(SVGElement::CTMScope) const |