| Index: Source/core/rendering/RenderMultiColumnSet.cpp
|
| diff --git a/Source/core/rendering/RenderMultiColumnSet.cpp b/Source/core/rendering/RenderMultiColumnSet.cpp
|
| index 24dffefc8c6fba4254dd511de54be91d2c8da66e..9ec3dde0df6236ff783ed8be0f7ff0aaa636f6e3 100644
|
| --- a/Source/core/rendering/RenderMultiColumnSet.cpp
|
| +++ b/Source/core/rendering/RenderMultiColumnSet.cpp
|
| @@ -101,7 +101,7 @@ unsigned RenderMultiColumnSet::findRunWithTallestColumns() const
|
| {
|
| unsigned indexWithLargestHeight = 0;
|
| LayoutUnit largestHeight;
|
| - LayoutUnit previousOffset;
|
| + LayoutUnit previousOffset = logicalTopInFlowThread();
|
| size_t runCount = m_contentRuns.size();
|
| ASSERT(runCount);
|
| for (size_t i = 0; i < runCount; i++) {
|
| @@ -120,14 +120,14 @@ void RenderMultiColumnSet::distributeImplicitBreaks()
|
| {
|
| #ifndef NDEBUG
|
| // There should be no implicit breaks assumed at this point.
|
| - for (unsigned i = 0; i < forcedBreaksCount(); i++)
|
| + for (unsigned i = 0; i < m_contentRuns.size(); i++)
|
| ASSERT(!m_contentRuns[i].assumedImplicitBreaks());
|
| #endif // NDEBUG
|
|
|
| // Insert a final content run to encompass all content. This will include overflow if this is
|
| // the last set.
|
| - addForcedBreak(logicalBottomInFlowThread());
|
| - unsigned breakCount = forcedBreaksCount();
|
| + addContentRun(logicalBottomInFlowThread());
|
| + unsigned columnCount = m_contentRuns.size();
|
|
|
| // If there is room for more breaks (to reach the used value of column-count), imagine that we
|
| // insert implicit breaks at suitable locations. At any given time, the content run with the
|
| @@ -135,19 +135,22 @@ void RenderMultiColumnSet::distributeImplicitBreaks()
|
| // column count by one and shrink its columns' height. Repeat until we have the desired total
|
| // number of breaks. The largest column height among the runs will then be the initial column
|
| // height for the balancer to use.
|
| - while (breakCount < m_computedColumnCount) {
|
| + while (columnCount < m_computedColumnCount) {
|
| unsigned index = findRunWithTallestColumns();
|
| m_contentRuns[index].assumeAnotherImplicitBreak();
|
| - breakCount++;
|
| + columnCount++;
|
| }
|
| }
|
|
|
| LayoutUnit RenderMultiColumnSet::calculateColumnHeight(bool initial) const
|
| {
|
| if (initial) {
|
| - // Start with the lowest imaginable column height.
|
| + // Start with the lowest imaginable column height. We use the tallest content run (after
|
| + // having "inserted" implicit breaks), and find its start offset (by looking at the previous
|
| + // run's end offset, or, if there's no previous run, the set's start offset in the flow
|
| + // thread).
|
| unsigned index = findRunWithTallestColumns();
|
| - LayoutUnit startOffset = index > 0 ? m_contentRuns[index - 1].breakOffset() : LayoutUnit();
|
| + LayoutUnit startOffset = index > 0 ? m_contentRuns[index - 1].breakOffset() : logicalTopInFlowThread();
|
| return std::max<LayoutUnit>(m_contentRuns[index].columnLogicalHeight(startOffset), m_minimumColumnHeight);
|
| }
|
|
|
| @@ -156,7 +159,7 @@ LayoutUnit RenderMultiColumnSet::calculateColumnHeight(bool initial) const
|
| return m_computedColumnHeight;
|
| }
|
|
|
| - if (forcedBreaksCount() >= computedColumnCount()) {
|
| + if (m_contentRuns.size() >= computedColumnCount()) {
|
| // Too many forced breaks to allow any implicit breaks. Initial balancing should already
|
| // have set a good height. There's nothing more we should do.
|
| return m_computedColumnHeight;
|
| @@ -173,21 +176,16 @@ LayoutUnit RenderMultiColumnSet::calculateColumnHeight(bool initial) const
|
| return m_computedColumnHeight + m_minSpaceShortage;
|
| }
|
|
|
| -void RenderMultiColumnSet::clearForcedBreaks()
|
| -{
|
| - m_contentRuns.clear();
|
| -}
|
| -
|
| -void RenderMultiColumnSet::addForcedBreak(LayoutUnit offsetFromFirstPage)
|
| +void RenderMultiColumnSet::addContentRun(LayoutUnit endOffsetFromFirstPage)
|
| {
|
| if (!multiColumnFlowThread()->requiresBalancing())
|
| return;
|
| - if (!m_contentRuns.isEmpty() && offsetFromFirstPage <= m_contentRuns.last().breakOffset())
|
| + if (!m_contentRuns.isEmpty() && endOffsetFromFirstPage <= m_contentRuns.last().breakOffset())
|
| return;
|
| // Append another item as long as we haven't exceeded used column count. What ends up in the
|
| // overflow area shouldn't affect column balancing.
|
| if (m_contentRuns.size() < m_computedColumnCount)
|
| - m_contentRuns.append(ContentRun(offsetFromFirstPage));
|
| + m_contentRuns.append(ContentRun(endOffsetFromFirstPage));
|
| }
|
|
|
| bool RenderMultiColumnSet::recalculateColumnHeight(bool initial)
|
| @@ -195,8 +193,10 @@ bool RenderMultiColumnSet::recalculateColumnHeight(bool initial)
|
| ASSERT(multiColumnFlowThread()->requiresBalancing());
|
|
|
| LayoutUnit oldColumnHeight = m_computedColumnHeight;
|
| - if (initial)
|
| + if (initial) {
|
| + // Post-process the content runs and find out where the implicit breaks will occur.
|
| distributeImplicitBreaks();
|
| + }
|
| LayoutUnit newColumnHeight = calculateColumnHeight(initial);
|
| setAndConstrainColumnHeight(newColumnHeight);
|
|
|
| @@ -210,7 +210,7 @@ bool RenderMultiColumnSet::recalculateColumnHeight(bool initial)
|
| return false; // No change. We're done.
|
|
|
| m_minSpaceShortage = RenderFlowThread::maxLogicalHeight();
|
| - clearForcedBreaks();
|
| + m_contentRuns.clear();
|
| return true; // Need another pass.
|
| }
|
|
|
| @@ -279,7 +279,7 @@ void RenderMultiColumnSet::prepareForLayout()
|
| setAndConstrainColumnHeight(heightAdjustedForSetOffset(multiColumnFlowThread()->columnHeightAvailable()));
|
| }
|
|
|
| - clearForcedBreaks();
|
| + m_contentRuns.clear();
|
|
|
| // Nuke previously stored minimum column height. Contents may have changed for all we know.
|
| m_minimumColumnHeight = 0;
|
|
|