void RenderSVGRoot::layout() { ASSERT(needsLayout()); // Arbitrary affine transforms are incompatible with LayoutState. view()->disableLayoutState(); LayoutRepainter repainter(*this, checkForRepaintDuringLayout() && selfNeedsLayout()); int oldWidth = width(); calcWidth(); int oldHeight = height(); calcHeight(); SVGSVGElement* svg = static_cast<SVGSVGElement*>(node()); setWidth(static_cast<int>(width() * svg->currentScale())); setHeight(static_cast<int>(height() * svg->currentScale())); calcViewport(); // RenderSVGRoot needs to take special care to propagate window size changes to the children, // if the outermost <svg> is using relative x/y/width/height values. Hence the additonal parameters. layoutChildren(this, selfNeedsLayout() || (svg->hasRelativeValues() && (width() != oldWidth || height() != oldHeight))); repainter.repaintAfterLayout(); view()->enableLayoutState(); setNeedsLayout(false); }
void RenderSVGContainer::calcViewport() { SVGElement* svgelem = static_cast<SVGElement*>(element()); if (svgelem->hasTagName(SVGNames::svgTag)) { SVGSVGElement* svg = static_cast<SVGSVGElement*>(element()); if (!selfNeedsLayout() && !svg->hasRelativeValues()) return; float x = 0.0f; float y = 0.0f; if (parent()->isSVGContainer()) { x = svg->x().value(); y = svg->y().value(); } float w = svg->width().value(); float h = svg->height().value(); m_viewport = FloatRect(x, y, w, h); } else if (svgelem->hasTagName(SVGNames::markerTag)) { if (!selfNeedsLayout()) return; SVGMarkerElement* svg = static_cast<SVGMarkerElement*>(element()); float w = svg->markerWidth().value(); float h = svg->markerHeight().value(); m_viewport = FloatRect(0.0f, 0.0f, w, h); } }
void RenderSVGRoot::calcViewport() { SVGSVGElement* svg = static_cast<SVGSVGElement*>(node()); if (!selfNeedsLayout() && !svg->hasRelativeValues()) return; if (!svg->hasSetContainerSize()) { // In the normal case of <svg> being stand-alone or in a CSSBoxModel object we use // RenderBox::width()/height() (which pulls data from RenderStyle) m_viewportSize = FloatSize(width(), height()); } else { // In the SVGImage case grab the SVGLength values off of SVGSVGElement and use // the special relativeWidthValue accessors which respect the specified containerSize SVGLength width = svg->width(); SVGLength height = svg->height(); float viewportWidth = (width.unitType() == LengthTypePercentage) ? svg->relativeWidthValue() : width.value(svg); float viewportHeight = (height.unitType() == LengthTypePercentage) ? svg->relativeHeightValue() : height.value(svg); m_viewportSize = FloatSize(viewportWidth, viewportHeight); } }