AffineTransform SVGGraphicsElement::computeCTM(SVGElement::CTMScope mode, SVGGraphicsElement::StyleUpdateStrategy styleUpdateStrategy, const SVGGraphicsElement* ancestor) const { if (styleUpdateStrategy == AllowStyleUpdate) document().updateStyleAndLayoutIgnorePendingStylesheets(); AffineTransform ctm; bool done = false; for (const Element* currentElement = this; currentElement && !done; currentElement = currentElement->parentOrShadowHostElement()) { if (!currentElement->isSVGElement()) break; ctm = toSVGElement(currentElement)->localCoordinateSpaceTransform(mode).multiply(ctm); switch (mode) { case NearestViewportScope: // Stop at the nearest viewport ancestor. done = currentElement != this && isViewportElement(*currentElement); break; case AncestorScope: // Stop at the designated ancestor. done = currentElement == ancestor; break; default: ASSERT(mode == ScreenScope); break; } } return ctm; }
SVGElement* SVGGraphicsElement::farthestViewportElement() const { SVGElement* farthest = 0; for (Element* current = parentOrShadowHostElement(); current; current = current->parentOrShadowHostElement()) { if (isViewportElement(*current)) farthest = toSVGElement(current); } return farthest; }
SVGElement* SVGGraphicsElement::nearestViewportElement() const { for (Element* current = parentOrShadowHostElement(); current; current = current->parentOrShadowHostElement()) { if (isViewportElement(*current)) return toSVGElement(current); } return nullptr; }
SVGElement* SVGLocatable::farthestViewportElement(const SVGElement* element) { ASSERT(element); SVGElement* farthest = 0; for (ContainerNode* n = element->parentNode(); n; n = n->parentNode()) { if (isViewportElement(n)) farthest = static_cast<SVGElement*>(n); } return farthest; }
SVGElement* SVGLocatable::nearestViewportElement(const SVGElement* element) { ASSERT(element); for (ContainerNode* n = element->parentNode(); n; n = n->parentNode()) { if (isViewportElement(n)) return static_cast<SVGElement*>(n); } return 0; }
SVGElement* SVGLocatable::farthestViewportElement(const SVGElement* element) { ASSERT(element); SVGElement* farthest = 0; for (Element* current = element->parentOrShadowHostElement(); current; current = current->parentOrShadowHostElement()) { if (isViewportElement(current)) farthest = toSVGElement(current); } return farthest; }
SVGElement* SVGLocatable::nearestViewportElement(const SVGElement* element) { ASSERT(element); for (Element* current = element->parentOrShadowHostElement(); current; current = current->parentOrShadowHostElement()) { if (isViewportElement(current)) return toSVGElement(current); } return 0; }