void InitialColumnHeightFinder::examineBoxAfterEntering( const LayoutBox& box, LayoutUnit childLogicalHeight, EBreak previousBreakAfterValue) { if (m_lastBreakSeen > flowThreadOffset()) { // We have moved backwards. We're probably in a parallel flow, caused by // floats, sibling table cells, etc. m_lastBreakSeen = LayoutUnit(); } if (isLogicalTopWithinBounds(flowThreadOffset() - box.paginationStrut())) { if (box.needsForcedBreakBefore(previousBreakAfterValue)) { addContentRun(flowThreadOffset()); } else if (isFirstAfterBreak(flowThreadOffset()) && m_lastBreakSeen != flowThreadOffset()) { // This box is first after a soft break. m_lastBreakSeen = flowThreadOffset(); recordStrutBeforeOffset(flowThreadOffset(), box.paginationStrut()); } } if (box.getPaginationBreakability() != LayoutBox::AllowAnyBreaks) { m_tallestUnbreakableLogicalHeight = std::max(m_tallestUnbreakableLogicalHeight, childLogicalHeight); return; } // Need to examine inner multicol containers to find their tallest unbreakable // piece of content. if (!box.isLayoutBlockFlow()) return; LayoutMultiColumnFlowThread* innerFlowThread = toLayoutBlockFlow(box).multiColumnFlowThread(); if (!innerFlowThread || innerFlowThread->isLayoutPagedFlowThread()) return; LayoutUnit offsetInInnerFlowThread = flowThreadOffset() - innerFlowThread->blockOffsetInEnclosingFragmentationContext(); LayoutUnit innerUnbreakableHeight = innerFlowThread->tallestUnbreakableLogicalHeight(offsetInInnerFlowThread); m_tallestUnbreakableLogicalHeight = std::max(m_tallestUnbreakableLogicalHeight, innerUnbreakableHeight); }
void InitialColumnHeightFinder::examineBoxAfterEntering( const LayoutBox& box, EBreak previousBreakAfterValue) { if (isLogicalTopWithinBounds(flowThreadOffset() - box.paginationStrut())) { if (box.needsForcedBreakBefore(previousBreakAfterValue)) { addContentRun(flowThreadOffset()); } else { ASSERT(isFirstAfterBreak(flowThreadOffset()) || !box.paginationStrut()); if (isFirstAfterBreak(flowThreadOffset())) { // This box is first after a soft break. recordStrutBeforeOffset(flowThreadOffset(), box.paginationStrut()); } } } if (box.getPaginationBreakability() != LayoutBox::AllowAnyBreaks) { LayoutUnit unsplittableLogicalHeight = box.logicalHeight(); if (box.isFloating()) unsplittableLogicalHeight += box.marginBefore() + box.marginAfter(); m_tallestUnbreakableLogicalHeight = std::max(m_tallestUnbreakableLogicalHeight, unsplittableLogicalHeight); return; } // Need to examine inner multicol containers to find their tallest unbreakable // piece of content. if (!box.isLayoutBlockFlow()) return; LayoutMultiColumnFlowThread* innerFlowThread = toLayoutBlockFlow(box).multiColumnFlowThread(); if (!innerFlowThread || innerFlowThread->isLayoutPagedFlowThread()) return; LayoutUnit offsetInInnerFlowThread = flowThreadOffset() - innerFlowThread->blockOffsetInEnclosingFragmentationContext(); LayoutUnit innerUnbreakableHeight = innerFlowThread->tallestUnbreakableLogicalHeight(offsetInInnerFlowThread); m_tallestUnbreakableLogicalHeight = std::max(m_tallestUnbreakableLogicalHeight, innerUnbreakableHeight); }
LayoutSize MultiColumnFragmentainerGroup::flowThreadTranslationAtOffset(LayoutUnit offsetInFlowThread) const { LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread(); unsigned columnIndex = columnIndexAtOffset(offsetInFlowThread); LayoutRect portionRect(flowThreadPortionRectAt(columnIndex)); flowThread->flipForWritingMode(portionRect); LayoutRect columnRect(columnRectAt(columnIndex)); m_columnSet.flipForWritingMode(columnRect); LayoutSize translationRelativeToGroup = columnRect.location() - portionRect.location(); LayoutSize enclosingTranslation; if (LayoutMultiColumnFlowThread* enclosingFlowThread = flowThread->enclosingFlowThread()) { // Translation that would map points in the coordinate space of the outermost flow thread to // visual points in the first column in the first fragmentainer group (row) in our multicol // container. LayoutSize enclosingTranslationOrigin = enclosingFlowThread->flowThreadTranslationAtOffset(flowThread->blockOffsetInEnclosingFragmentationContext()); // Translation that would map points in the coordinate space of the outermost flow thread to // visual points in the first column in this fragmentainer group. enclosingTranslation = enclosingFlowThread->flowThreadTranslationAtOffset(blockOffsetInEnclosingFragmentationContext()); // What we ultimately return from this method is a translation that maps points in the // coordinate space of our flow thread to a visual point in a certain column in this // fragmentainer group. We had to go all the way up to the outermost flow thread, since this // fragmentainer group may be in a different outer column than the first outer column that // this multicol container lives in. It's the visual distance between the first // fragmentainer group and this fragmentainer group that we need to add to the translation. enclosingTranslation -= enclosingTranslationOrigin; } return enclosingTranslation + translationRelativeToGroup + offsetFromColumnSet() + m_columnSet.topLeftLocationOffset() - flowThread->topLeftLocationOffset(); }