bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeightCalculation calculationMode) { LayoutUnit oldColumnHeight = m_columnHeight; m_maxColumnHeight = calculateMaxColumnHeight(); if (heightIsAuto()) { if (calculationMode == GuessFromFlowThreadPortion) { // Post-process the content runs and find out where the implicit breaks will occur. distributeImplicitBreaks(); } LayoutUnit newColumnHeight = calculateColumnHeight(calculationMode); setAndConstrainColumnHeight(newColumnHeight); // After having calculated an initial column height, the multicol container typically needs at // least one more layout pass with a new column height, but if a height was specified, we only // need to do this if we think that we need less space than specified. Conversely, if we // determined that the columns need to be as tall as the specified height of the container, we // have already laid it out correctly, and there's no need for another pass. } else { // The position of the column set may have changed, in which case height available for // columns may have changed as well. setAndConstrainColumnHeight(m_columnHeight); } // We can get rid of the content runs now, if we haven't already done so. They are only needed // to calculate the initial balanced column height. In fact, we have to get rid of them before // the next layout pass, since each pass will rebuild this. m_contentRuns.clear(); if (m_columnHeight == oldColumnHeight) return false; // No change. We're done. m_minSpaceShortage = LayoutUnit::max(); return true; // Need another pass. }
bool RenderMultiColumnSet::recalculateColumnHeight(BalancedHeightCalculation calculationMode) { ASSERT(multiColumnFlowThread()->requiresBalancing()); LayoutUnit oldColumnHeight = m_columnHeight; if (calculationMode == GuessFromFlowThreadPortion) { // Post-process the content runs and find out where the implicit breaks will occur. distributeImplicitBreaks(); } LayoutUnit newColumnHeight = calculateColumnHeight(calculationMode); setAndConstrainColumnHeight(newColumnHeight); // After having calculated an initial column height, the multicol container typically needs at // least one more layout pass with a new column height, but if a height was specified, we only // need to do this if we think that we need less space than specified. Conversely, if we // determined that the columns need to be as tall as the specified height of the container, we // have already laid it out correctly, and there's no need for another pass. // We can get rid of the content runs now, if we haven't already done so. They are only needed // to calculate the initial balanced column height. In fact, we have to get rid of them before // the next layout pass, since each pass will rebuild this. m_contentRuns.clear(); if (m_columnHeight == oldColumnHeight) return false; // No change. We're done. m_minSpaceShortage = RenderFlowThread::maxLogicalHeight(); return true; // Need another pass. }
InitialColumnHeightFinder::InitialColumnHeightFinder(const MultiColumnFragmentainerGroup& group) : ColumnBalancer(group) { m_shortestStruts.resize(group.columnSet().usedColumnCount()); for (auto& strut : m_shortestStruts) strut = LayoutUnit::max(); traverse(); // We have now found each explicit / forced break, and their location. Now we need to figure out // how many additional implicit / soft breaks we need and guess where they will occur, in order // to provide an initial column height. distributeImplicitBreaks(); }
InitialColumnHeightFinder::InitialColumnHeightFinder( const LayoutMultiColumnSet& columnSet, LayoutUnit logicalTopInFlowThread, LayoutUnit logicalBottomInFlowThread) : ColumnBalancer(columnSet, logicalTopInFlowThread, logicalBottomInFlowThread) { m_shortestStruts.resize(columnSet.usedColumnCount()); for (auto& strut : m_shortestStruts) strut = LayoutUnit::max(); traverse(); // We have now found each explicit / forced break, and their location. Now we // need to figure out how many additional implicit / soft breaks we need and // guess where they will occur, in order // to provide an initial column height. distributeImplicitBreaks(); }
bool RenderMultiColumnSet::recalculateBalancedHeight(bool initial) { ASSERT(multiColumnFlowThread()->requiresBalancing()); LayoutUnit oldColumnHeight = m_computedColumnHeight; if (initial) distributeImplicitBreaks(); LayoutUnit newColumnHeight = calculateBalancedHeight(initial); setAndConstrainColumnHeight(newColumnHeight); // After having calculated an initial column height, the multicol container typically needs at // least one more layout pass with a new column height, but if a height was specified, we only // need to do this if we think that we need less space than specified. Conversely, if we // determined that the columns need to be as tall as the specified height of the container, we // have already laid it out correctly, and there's no need for another pass. if (m_computedColumnHeight == oldColumnHeight) return false; // No change. We're done. m_minSpaceShortage = RenderFlowThread::maxLogicalHeight(); clearForcedBreaks(); return true; // Need another pass. }