static void setPatternAttributes(const SVGPatternElement* element, PatternAttributes& attributes) { if (!attributes.hasX() && element->x()->isSpecified()) attributes.setX(element->x()->currentValue()); if (!attributes.hasY() && element->y()->isSpecified()) attributes.setY(element->y()->currentValue()); if (!attributes.hasWidth() && element->width()->isSpecified()) attributes.setWidth(element->width()->currentValue()); if (!attributes.hasHeight() && element->height()->isSpecified()) attributes.setHeight(element->height()->currentValue()); if (!attributes.hasViewBox() && element->viewBox()->isSpecified() && element->viewBox()->currentValue()->isValid()) attributes.setViewBox(element->viewBox()->currentValue()->value()); if (!attributes.hasPreserveAspectRatio() && element->preserveAspectRatio()->isSpecified()) attributes.setPreserveAspectRatio(element->preserveAspectRatio()->currentValue()); if (!attributes.hasPatternUnits() && element->patternUnits()->isSpecified()) attributes.setPatternUnits(element->patternUnits()->currentValue()->enumValue()); if (!attributes.hasPatternContentUnits() && element->patternContentUnits()->isSpecified()) attributes.setPatternContentUnits(element->patternContentUnits()->currentValue()->enumValue()); if (!attributes.hasPatternTransform() && element->patternTransform()->isSpecified()) { AffineTransform transform; element->patternTransform()->currentValue()->concatenate(transform); attributes.setPatternTransform(transform); } if (!attributes.hasPatternContentElement() && ElementTraversal::firstWithin(*element)) attributes.setPatternContentElement(element); }
static void setPatternAttributes(const SVGPatternElement& element, PatternAttributes& attributes) { if (!attributes.hasX() && element.hasAttribute(SVGNames::xAttr)) attributes.setX(element.x()); if (!attributes.hasY() && element.hasAttribute(SVGNames::yAttr)) attributes.setY(element.y()); if (!attributes.hasWidth() && element.hasAttribute(SVGNames::widthAttr)) attributes.setWidth(element.width()); if (!attributes.hasHeight() && element.hasAttribute(SVGNames::heightAttr)) attributes.setHeight(element.height()); if (!attributes.hasViewBox() && element.hasAttribute(SVGNames::viewBoxAttr) && element.viewBoxIsValid()) attributes.setViewBox(element.viewBox()); if (!attributes.hasPreserveAspectRatio() && element.hasAttribute(SVGNames::preserveAspectRatioAttr)) attributes.setPreserveAspectRatio(element.preserveAspectRatio()); if (!attributes.hasPatternUnits() && element.hasAttribute(SVGNames::patternUnitsAttr)) attributes.setPatternUnits(element.patternUnits()); if (!attributes.hasPatternContentUnits() && element.hasAttribute(SVGNames::patternContentUnitsAttr)) attributes.setPatternContentUnits(element.patternContentUnits()); if (!attributes.hasPatternTransform() && element.hasAttribute(SVGNames::patternTransformAttr)) { AffineTransform transform; element.patternTransform().concatenate(transform); attributes.setPatternTransform(transform); } if (!attributes.hasPatternContentElement() && element.childElementCount()) attributes.setPatternContentElement(&element); }
void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes) const { if (!attributes.hasX() && hasAttribute(SVGNames::xAttr)) attributes.setX(x()); if (!attributes.hasY() && hasAttribute(SVGNames::yAttr)) attributes.setY(y()); if (!attributes.hasWidth() && hasAttribute(SVGNames::widthAttr)) attributes.setWidth(width()); if (!attributes.hasHeight() && hasAttribute(SVGNames::heightAttr)) attributes.setHeight(height()); if (!attributes.hasViewBox() && hasAttribute(SVGNames::viewBoxAttr) && viewBoxIsValid()) attributes.setViewBox(viewBox()); if (!attributes.hasPreserveAspectRatio() && hasAttribute(SVGNames::preserveAspectRatioAttr)) attributes.setPreserveAspectRatio(preserveAspectRatio()); if (!attributes.hasPatternUnits() && hasAttribute(SVGNames::patternUnitsAttr)) attributes.setPatternUnits(patternUnits()); if (!attributes.hasPatternContentUnits() && hasAttribute(SVGNames::patternContentUnitsAttr)) attributes.setPatternContentUnits(patternContentUnits()); if (!attributes.hasPatternTransform() && hasAttribute(SVGNames::patternTransformAttr)) { AffineTransform transform; patternTransform().concatenate(transform); attributes.setPatternTransform(transform); } if (!attributes.hasPatternContentElement() && childElementCount()) attributes.setPatternContentElement(this); }
void SVGPatternElement::collectPatternAttributes(PatternAttributes& attributes) const { HashSet<const SVGPatternElement*> processedPatterns; const SVGPatternElement* current = this; while (current) { if (!attributes.hasX() && current->hasAttribute(SVGNames::xAttr)) attributes.setX(current->x()); if (!attributes.hasY() && current->hasAttribute(SVGNames::yAttr)) attributes.setY(current->y()); if (!attributes.hasWidth() && current->hasAttribute(SVGNames::widthAttr)) attributes.setWidth(current->width()); if (!attributes.hasHeight() && current->hasAttribute(SVGNames::heightAttr)) attributes.setHeight(current->height()); if (!attributes.hasViewBox() && current->hasAttribute(SVGNames::viewBoxAttr)) attributes.setViewBox(current->viewBox()); if (!attributes.hasPreserveAspectRatio() && current->hasAttribute(SVGNames::preserveAspectRatioAttr)) attributes.setPreserveAspectRatio(current->preserveAspectRatio()); if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::patternUnitsAttr)) attributes.setBoundingBoxMode(current->patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX); if (!attributes.hasBoundingBoxModeContent() && current->hasAttribute(SVGNames::patternContentUnitsAttr)) attributes.setBoundingBoxModeContent(current->patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX); if (!attributes.hasPatternTransform() && current->hasAttribute(SVGNames::patternTransformAttr)) { AffineTransform transform; current->patternTransform().concatenate(transform); attributes.setPatternTransform(transform); } if (!attributes.hasPatternContentElement() && current->hasChildNodes()) attributes.setPatternContentElement(current); processedPatterns.add(current); // Respect xlink:href, take attributes from referenced element Node* refNode = ownerDocument()->getElementById(SVGURIReference::getTarget(current->href())); if (refNode && refNode->hasTagName(SVGNames::patternTag)) { current = static_cast<const SVGPatternElement*>(const_cast<const Node*>(refNode)); // Cycle detection if (processedPatterns.contains(current)) { current = 0; break; } } else current = 0; } }
PatternAttributes SVGPatternElement::collectPatternProperties() const { PatternAttributes attributes; HashSet<const SVGPatternElement*> processedPatterns; const SVGPatternElement* current = this; while (current) { if (!attributes.hasX() && current->hasAttribute(SVGNames::xAttr)) attributes.setX(current->x()); if (!attributes.hasY() && current->hasAttribute(SVGNames::yAttr)) attributes.setY(current->y()); if (!attributes.hasWidth() && current->hasAttribute(SVGNames::widthAttr)) attributes.setWidth(current->width()); if (!attributes.hasHeight() && current->hasAttribute(SVGNames::heightAttr)) attributes.setHeight(current->height()); if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::patternUnitsAttr)) attributes.setBoundingBoxMode(current->patternUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX); if (!attributes.hasBoundingBoxModeContent() && current->hasAttribute(SVGNames::patternContentUnitsAttr)) attributes.setBoundingBoxModeContent(current->patternContentUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX); if (!attributes.hasPatternTransform() && current->hasAttribute(SVGNames::patternTransformAttr)) attributes.setPatternTransform(current->patternTransform()->consolidate().matrix()); if (!attributes.hasPatternContentElement() && current->hasChildNodes()) attributes.setPatternContentElement(current); processedPatterns.add(current); // Respect xlink:href, take attributes from referenced element Node* refNode = ownerDocument()->getElementById(SVGURIReference::getTarget(current->href())); if (refNode && refNode->hasTagName(SVGNames::patternTag)) { current = static_cast<const SVGPatternElement*>(const_cast<const Node*>(refNode)); // Cycle detection if (processedPatterns.contains(current)) return PatternAttributes(); } else current = 0; } return attributes; }