void RenderRegion::ensureOverflowForBox(const RenderBox* box, RefPtr<RenderOverflow>& overflow, bool forceCreation) { RenderFlowThread* flowThread = this->flowThread(); ASSERT(flowThread); RenderBoxRegionInfo* boxInfo = renderBoxRegionInfo(box); if (!boxInfo && !forceCreation) return; if (boxInfo && boxInfo->overflow()) { overflow = boxInfo->overflow(); return; } LayoutRect borderBox = box->borderBoxRectInRegion(this); LayoutRect clientBox; ASSERT(flowThread->objectShouldPaintInFlowRegion(box, this)); if (!borderBox.isEmpty()) { borderBox = rectFlowPortionForBox(box, borderBox); clientBox = box->clientBoxRectInRegion(this); clientBox = rectFlowPortionForBox(box, clientBox); flowThread->flipForWritingModeLocalCoordinates(borderBox); flowThread->flipForWritingModeLocalCoordinates(clientBox); } if (boxInfo) { boxInfo->createOverflow(clientBox, borderBox); overflow = boxInfo->overflow(); } else overflow = adoptRef(new RenderOverflow(clientBox, borderBox)); }
void RenderNamedFlowFragment::absoluteQuadsForBoxInRegion(Vector<FloatQuad>& quads, bool* wasFixed, const RenderBox* renderer, float localTop, float localBottom) { LayoutRect layoutLocalRect(0, localTop, renderer->borderBoxRectInRegion(this).width(), localBottom - localTop); LayoutRect fragmentRect = rectFlowPortionForBox(renderer, layoutLocalRect); // We want to skip the 0px height fragments for non-empty boxes that may appear in case the bottom of the box // overlaps the bottom of a region. if (localBottom != localTop && !fragmentRect.height()) return; CurrentRenderRegionMaintainer regionMaintainer(*this); quads.append(renderer->localToAbsoluteQuad(FloatRect(fragmentRect), UseTransforms, wasFixed)); }
// FIXME: This doesn't work for writing modes. LayoutRect RenderRegion::layoutOverflowRectForBoxForPropagation(const RenderBox* box) { // Only propagate interior layout overflow if we don't clip it. LayoutRect rect = box->borderBoxRectInRegion(this); rect = rectFlowPortionForBox(box, rect); if (!box->hasOverflowClip()) rect.unite(layoutOverflowRectForBox(box)); bool hasTransform = box->hasLayer() && box->layer()->transform(); if (box->isInFlowPositioned() || hasTransform) { if (hasTransform) rect = box->layer()->currentTransform().mapRect(rect); if (box->isInFlowPositioned()) rect.move(box->offsetForInFlowPosition()); } return rect; }