void RenderSVGViewportContainer::calcViewport() { SVGSVGElement& svg = svgSVGElement(); FloatRect oldViewport = m_viewport; SVGLengthContext lengthContext(&svg); m_viewport = FloatRect(svg.x().value(lengthContext), svg.y().value(lengthContext), svg.width().value(lengthContext), svg.height().value(lengthContext)); SVGElement* correspondingElement = svg.correspondingElement(); if (correspondingElement && svg.isInShadowTree()) { const HashSet<SVGElementInstance*>& instances = correspondingElement->instancesForElement(); ASSERT(!instances.isEmpty()); SVGUseElement* useElement = 0; const HashSet<SVGElementInstance*>::const_iterator end = instances.end(); for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) { const SVGElementInstance* instance = (*it); ASSERT(instance->correspondingElement()->hasTagName(SVGNames::svgTag) || instance->correspondingElement()->hasTagName(SVGNames::symbolTag)); if (instance->shadowTreeElement() == &svg) { ASSERT(correspondingElement == instance->correspondingElement()); useElement = instance->directUseElement(); if (!useElement) useElement = instance->correspondingUseElement(); break; } } ASSERT(useElement); bool isSymbolElement = correspondingElement->hasTagName(SVGNames::symbolTag); // Spec (<use> on <symbol>): This generated 'svg' will always have explicit values for attributes width and height. // If attributes width and/or height are provided on the 'use' element, then these attributes // will be transferred to the generated 'svg'. If attributes width and/or height are not specified, // the generated 'svg' element will use values of 100% for these attributes. // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these // values will override the corresponding attributes on the 'svg' in the generated tree. SVGLengthContext lengthContext(&svg); if (useElement->hasAttribute(SVGNames::widthAttr)) m_viewport.setWidth(useElement->width().value(lengthContext)); else if (isSymbolElement && svg.hasAttribute(SVGNames::widthAttr)) { SVGLength containerWidth(LengthModeWidth, "100%"); m_viewport.setWidth(containerWidth.value(lengthContext)); } if (useElement->hasAttribute(SVGNames::heightAttr)) m_viewport.setHeight(useElement->height().value(lengthContext)); else if (isSymbolElement && svg.hasAttribute(SVGNames::heightAttr)) { SVGLength containerHeight(LengthModeHeight, "100%"); m_viewport.setHeight(containerHeight.value(lengthContext)); } } if (oldViewport != m_viewport) { setNeedsBoundariesUpdate(); setNeedsTransformUpdate(); } }
void RenderSVGModelObject::styleWillChange(StyleDifference diff, const RenderStyle* newStyle) { if (diff == StyleDifferenceLayout) { setNeedsBoundariesUpdate(); if (newStyle->hasTransform()) setNeedsTransformUpdate(); } RenderObject::styleWillChange(diff, newStyle); }
void RenderSVGModelObject::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { if (diff == StyleDifferenceLayout) { setNeedsBoundariesUpdate(); if (style().hasTransform()) setNeedsTransformUpdate(); } RenderElement::styleDidChange(diff, oldStyle); SVGResourcesCache::clientStyleChanged(*this, diff, style()); }
void LayoutSVGBlock::styleDidChange(StyleDifference diff, const ComputedStyle* oldStyle) { if (diff.needsFullLayout()) { setNeedsBoundariesUpdate(); if (style()->hasTransform()) setNeedsTransformUpdate(); } if (isBlendingAllowed()) { bool hasBlendModeChanged = (oldStyle && oldStyle->hasBlendMode()) == !style()->hasBlendMode(); if (parent() && hasBlendModeChanged) parent()->descendantIsolationRequirementsChanged(style()->hasBlendMode() ? DescendantIsolationRequired : DescendantIsolationNeedsUpdate); } LayoutBlock::styleDidChange(diff, oldStyle); SVGResourcesCache::clientStyleChanged(this, diff, styleRef()); }
void LayoutSVGViewportContainer::calcViewport() { SVGElement* element = this->element(); ASSERT(element); if (!isSVGSVGElement(*element)) return; SVGSVGElement* svg = toSVGSVGElement(element); FloatRect oldViewport = m_viewport; SVGLengthContext lengthContext(element); m_viewport = FloatRect(svg->x()->currentValue()->value(lengthContext), svg->y()->currentValue()->value(lengthContext), svg->width()->currentValue()->value(lengthContext), svg->height()->currentValue()->value(lengthContext)); if (oldViewport != m_viewport) { setNeedsBoundariesUpdate(); setNeedsTransformUpdate(); } }
void SVGGraphicsElement::svgAttributeChanged(const QualifiedName& attrName) { if (!isSupportedAttribute(attrName)) { SVGElement::svgAttributeChanged(attrName); return; } SVGElementInstance::InvalidationGuard invalidationGuard(this); if (SVGTests::handleAttributeChange(this, attrName)) return; auto renderer = this->renderer(); if (!renderer) return; if (attrName == SVGNames::transformAttr) { renderer->setNeedsTransformUpdate(); RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer); return; } ASSERT_NOT_REACHED(); }