void SVGRenderSupport::computeContainerBoundingBoxes(const RenderObject* container, FloatRect& objectBoundingBox, FloatRect& strokeBoundingBox, FloatRect& repaintBoundingBox) { bool isFirstChild = true; for (RenderObject* current = container->firstChild(); current; current = current->nextSibling()) { if (current->isSVGHiddenContainer()) continue; const AffineTransform& transform = current->localToParentTransform(); if (transform.isIdentity()) { if (isFirstChild) objectBoundingBox = current->objectBoundingBox(); else objectBoundingBox.uniteEvenIfEmpty(current->objectBoundingBox()); strokeBoundingBox.unite(current->strokeBoundingBox()); repaintBoundingBox.unite(current->repaintRectInLocalCoordinates()); } else { if (isFirstChild) objectBoundingBox = transform.mapRect(current->objectBoundingBox()); else objectBoundingBox.uniteEvenIfEmpty(transform.mapRect(current->objectBoundingBox())); strokeBoundingBox.unite(transform.mapRect(current->strokeBoundingBox())); repaintBoundingBox.unite(transform.mapRect(current->repaintRectInLocalCoordinates())); } isFirstChild = false; } }
IntRect computeBoundingBox(const RenderObject& renderer, const Layout& layout) { auto resolver = runResolver(downcast<RenderBlockFlow>(*renderer.parent()), layout); FloatRect boundingBoxRect; for (auto run : resolver.rangeForRenderer(renderer)) { FloatRect rect = run.rect(); if (boundingBoxRect == FloatRect()) boundingBoxRect = rect; else boundingBoxRect.uniteEvenIfEmpty(rect); } return enclosingIntRect(boundingBoxRect); }
// Update a bounding box taking into account the validity of the other bounding box. inline void SVGRenderSupport::updateObjectBoundingBox(FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, RenderObject* other, FloatRect otherBoundingBox) { bool otherValid = other->isSVGContainer() ? toRenderSVGContainer(other)->isObjectBoundingBoxValid() : true; if (!otherValid) return; if (!objectBoundingBoxValid) { objectBoundingBox = otherBoundingBox; objectBoundingBoxValid = true; return; } objectBoundingBox.uniteEvenIfEmpty(otherBoundingBox); }
// Update a bounding box taking into account the validity of the other bounding box. static inline void updateObjectBoundingBox(FloatRect& objectBoundingBox, bool& objectBoundingBoxValid, RenderObject* other, FloatRect otherBoundingBox) { bool otherValid = is<RenderSVGContainer>(*other) ? downcast<RenderSVGContainer>(*other).isObjectBoundingBoxValid() : true; if (!otherValid) return; if (!objectBoundingBoxValid) { objectBoundingBox = otherBoundingBox; objectBoundingBoxValid = true; return; } objectBoundingBox.uniteEvenIfEmpty(otherBoundingBox); }