bool SVGLinearGradientElement::collectGradientAttributes(LinearGradientAttributes& attributes) { if (!renderer()) return false; HashSet<SVGGradientElement*> processedGradients; SVGGradientElement* current = this; setGradientAttributes(*current, attributes); processedGradients.add(current); while (true) { // Respect xlink:href, take attributes from referenced element Node* refNode = SVGURIReference::targetElementFromIRIString(current->href(), document()); if (is<SVGGradientElement>(refNode)) { current = downcast<SVGGradientElement>(refNode); // Cycle detection if (processedGradients.contains(current)) return true; if (!current->renderer()) return false; setGradientAttributes(*current, attributes, current->hasTagName(SVGNames::linearGradientTag)); processedGradients.add(current); } else return true; } ASSERT_NOT_REACHED(); return false; }
bool SVGLinearGradientElement::collectGradientAttributes(LinearGradientAttributes& attributes) { if (!renderer()) return false; HashSet<SVGGradientElement*> processedGradients; SVGGradientElement* current = this; setGradientAttributes(current, attributes); processedGradients.add(current); 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->renderer()) return false; setGradientAttributes(current, attributes, isSVGLinearGradientElement(*current)); processedGradients.add(current); } else { return true; } } ASSERT_NOT_REACHED(); return false; }
void RenderSVGGradientStop::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { RenderObject::styleDidChange(diff, oldStyle); if (!diff.hasDifference()) return; // <stop> elements should only be allowed to make renderers under gradient elements // but I can imagine a few cases we might not be catching, so let's not crash if our parent isn't a gradient. SVGGradientElement* gradient = gradientElement(); if (!gradient) return; RenderObject* renderer = gradient->renderer(); if (!renderer) return; RenderSVGResourceContainer* container = toRenderSVGResourceContainer(renderer); container->removeAllClientsFromCache(); }
bool SVGRadialGradientElement::collectGradientAttributes(RadialGradientAttributes& attributes) { if (!renderer()) return false; WillBeHeapHashSet<RawPtrWillBeMember<SVGGradientElement> > processedGradients; SVGGradientElement* current = this; setGradientAttributes(current, attributes); processedGradients.add(current); 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)) break; if (!current->renderer()) return false; setGradientAttributes(current, attributes, isSVGRadialGradientElement(*current)); processedGradients.add(current); } else { break; } } // Handle default values for fx/fy if (!attributes.hasFx()) attributes.setFx(attributes.cx()); if (!attributes.hasFy()) attributes.setFy(attributes.cy()); return true; }
bool SVGRadialGradientElement::collectGradientAttributes(RadialGradientAttributes& attributes) { if (!renderer()) return false; HashSet<SVGGradientElement*> processedGradients; SVGGradientElement* current = this; setGradientAttributes(*current, attributes); processedGradients.add(current); while (true) { // Respect xlink:href, take attributes from referenced element Node* refNode = SVGURIReference::targetElementFromIRIString(current->href(), document()); if (is<SVGGradientElement>(refNode)) { current = downcast<SVGGradientElement>(refNode); // Cycle detection if (processedGradients.contains(current)) break; if (!current->renderer()) return false; setGradientAttributes(*current, attributes, current->hasTagName(SVGNames::radialGradientTag)); processedGradients.add(current); } else break; } // Handle default values for fx/fy if (!attributes.hasFx()) attributes.setFx(attributes.cx()); if (!attributes.hasFy()) attributes.setFy(attributes.cy()); return true; }