Vector<IntRect> collectAbsoluteRects(const RenderObject& renderer, const Layout& layout, const LayoutPoint& accumulatedOffset) { Vector<IntRect> rects; auto resolver = runResolver(downcast<RenderBlockFlow>(*renderer.parent()), layout); for (const auto& run : resolver.rangeForRenderer(renderer)) { FloatRect rect = run.rect(); rects.append(enclosingIntRect(FloatRect(accumulatedOffset + rect.location(), rect.size()))); } return rects; }
IntPoint computeFirstRunLocation(const RenderObject& renderer, const Layout& layout) { auto resolver = runResolver(downcast<RenderBlockFlow>(*renderer.parent()), layout); const auto& it = resolver.rangeForRenderer(renderer); auto begin = it.begin(); if (begin == it.end()) return IntPoint(0, 0); return flooredIntPoint((*begin).rect().location()); }
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); }