bool RenderFlowThread::logicalWidthChangedInRegions(const RenderBlock* block, LayoutUnit offsetFromLogicalTopOfFirstPage) { if (!hasRegions() || block == this) // Not necessary, since if any region changes, we do a full pagination relayout anyway. return false; RenderRegion* startRegion; RenderRegion* endRegion; getRegionRangeForBox(block, startRegion, endRegion); // If the block doesn't have a startRegion (and implicitly a region range) it's safe to assume the width in regions has changed (e.g. the region chain was invalidated). if (!startRegion) return true; for (RenderRegionList::iterator iter = m_regionList.find(startRegion); iter != m_regionList.end(); ++iter) { RenderRegion* region = *iter; ASSERT(!region->needsLayout()); OwnPtr<RenderBoxRegionInfo> oldInfo = region->takeRenderBoxRegionInfo(block); if (!oldInfo) continue; LayoutUnit oldLogicalWidth = oldInfo->logicalWidth(); RenderBoxRegionInfo* newInfo = block->renderBoxRegionInfo(region, offsetFromLogicalTopOfFirstPage); if (!newInfo || newInfo->logicalWidth() != oldLogicalWidth) return true; if (region == endRegion) break; } return false; }
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)); }
bool RenderFlowThread::logicalWidthChangedInRegions(const RenderBlock* block, LayoutUnit offsetFromLogicalTopOfFirstPage) { if (!hasRegions() || block == this) // Not necessary, since if any region changes, we do a full pagination relayout anyway. return false; RenderRegion* startRegion; RenderRegion* endRegion; getRegionRangeForBox(block, startRegion, endRegion); for (RenderRegionList::iterator iter = m_regionList.find(startRegion); iter != m_regionList.end(); ++iter) { RenderRegion* region = *iter; if (!region->isValid()) continue; ASSERT(!region->needsLayout()); OwnPtr<RenderBoxRegionInfo> oldInfo = region->takeRenderBoxRegionInfo(block); if (!oldInfo) continue; LayoutUnit oldLogicalWidth = oldInfo->logicalWidth(); RenderBoxRegionInfo* newInfo = block->renderBoxRegionInfo(region, offsetFromLogicalTopOfFirstPage); if (!newInfo || newInfo->logicalWidth() != oldLogicalWidth) return true; if (region == endRegion) break; } return false; }
LayoutRect RenderNamedFlowFragment::visualOverflowRect() const { if (isValid()) { RenderBoxRegionInfo* boxInfo = renderBoxRegionInfo(flowThread()); if (boxInfo && boxInfo->overflow()) return boxInfo->overflow()->visualOverflowRect(); } return RenderRegion::visualOverflowRect(); }
bool RenderFlowThread::logicalWidthChangedInRegions(const RenderBlock* block, LayoutUnit offsetFromLogicalTopOfFirstPage) { if (!hasRegions()) return false; RenderRegion* startRegion; RenderRegion* endRegion; getRegionRangeForBox(block, startRegion, endRegion); // When the region chain is invalidated the box information is discarded so we must assume the width has changed. if (m_pageLogicalSizeChanged && !startRegion) return true; // Not necessary for the flow thread, since we already computed the correct info for it. if (block == this) return false; for (RenderRegionList::iterator iter = m_regionList.find(startRegion); iter != m_regionList.end(); ++iter) { RenderRegion* region = *iter; ASSERT(!region->needsLayout() || region->isRenderRegionSet()); OwnPtr<RenderBoxRegionInfo> oldInfo = region->takeRenderBoxRegionInfo(block); if (!oldInfo) continue; LayoutUnit oldLogicalWidth = oldInfo->logicalWidth(); RenderBoxRegionInfo* newInfo = block->renderBoxRegionInfo(region, offsetFromLogicalTopOfFirstPage); if (!newInfo || newInfo->logicalWidth() != oldLogicalWidth) return true; if (region == endRegion) break; } return false; }