void RenderSVGPath::updateCachedBoundaries() { if (m_path.isEmpty()) { m_fillBoundingBox = FloatRect(); m_strokeAndMarkerBoundingBox = FloatRect(); m_repaintBoundingBox = FloatRect(); return; } // Cache _unclipped_ fill bounding box, used for calculations in resources m_fillBoundingBox = m_path.boundingRect(); // Cache _unclipped_ stroke bounding box, used for calculations in resources (includes marker boundaries) m_strokeAndMarkerBoundingBox = m_fillBoundingBox; const SVGRenderStyle* svgStyle = style()->svgStyle(); if (svgStyle->hasStroke()) { BoundingRectStrokeStyleApplier strokeStyle(this, style()); m_strokeAndMarkerBoundingBox.unite(m_path.strokeBoundingRect(&strokeStyle)); } if (svgStyle->hasMarkers()) { FloatRect markerBounds = calculateMarkerBoundsIfNeeded(); if (!markerBounds.isEmpty()) m_strokeAndMarkerBoundingBox.unite(markerBounds); } // Cache smallest possible repaint rectangle m_repaintBoundingBox = m_strokeAndMarkerBoundingBox; SVGRenderSupport::intersectRepaintRectWithResources(this, m_repaintBoundingBox); }
FloatRect RenderPath::markerBoundingBox() const { if (m_path.isEmpty()) return FloatRect(); if (m_cachedLocalMarkerBBox.isEmpty()) calculateMarkerBoundsIfNeeded(); return m_cachedLocalMarkerBBox; }