Index: third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp |
diff --git a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp |
index 8c6478860721b4c6952348002d7ede819f939bb4..be4f84ef57a97144b1927eaec772ad6f28cecf90 100644 |
--- a/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp |
+++ b/third_party/WebKit/Source/core/layout/MultiColumnFragmentainerGroup.cpp |
@@ -6,6 +6,7 @@ |
#include "core/layout/MultiColumnFragmentainerGroup.h" |
+#include "core/layout/ColumnBalancer.h" |
#include "core/layout/LayoutMultiColumnSet.h" |
namespace blink { |
@@ -15,6 +16,11 @@ MultiColumnFragmentainerGroup::MultiColumnFragmentainerGroup(LayoutMultiColumnSe |
{ |
} |
+bool MultiColumnFragmentainerGroup::isFirstGroup() const |
+{ |
+ return &m_columnSet.firstFragmentainerGroup() == this; |
+} |
+ |
bool MultiColumnFragmentainerGroup::isLastGroup() const |
{ |
return &m_columnSet.lastFragmentainerGroup() == this; |
@@ -65,33 +71,6 @@ void MultiColumnFragmentainerGroup::resetColumnHeight() |
if (m_columnHeight != oldColumnHeight) |
m_columnSet.setChildNeedsLayout(MarkOnlyThis); |
- |
- // Content runs are only needed in the initial layout pass, in order to find an initial column |
- // height, and should have been deleted afterwards. We're about to rebuild the content runs, so |
- // the list needs to be empty. |
- ASSERT(m_contentRuns.isEmpty()); |
-} |
- |
-void MultiColumnFragmentainerGroup::addContentRun(LayoutUnit endOffsetInFlowThread) |
-{ |
- if (!m_contentRuns.isEmpty() && endOffsetInFlowThread <= 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_columnSet.usedColumnCount()) |
- m_contentRuns.append(ContentRun(endOffsetInFlowThread)); |
-} |
- |
-void MultiColumnFragmentainerGroup::recordSpaceShortage(LayoutUnit spaceShortage) |
-{ |
- if (spaceShortage >= m_minSpaceShortage) |
- return; |
- |
- // The space shortage is what we use as our stretch amount. We need a positive number here in |
- // order to get anywhere. |
- ASSERT(spaceShortage > 0); |
- |
- m_minSpaceShortage = spaceShortage; |
} |
bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeightCalculation calculationMode) |
@@ -101,10 +80,6 @@ bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeight |
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 |
@@ -118,15 +93,9 @@ bool MultiColumnFragmentainerGroup::recalculateColumnHeight(BalancedColumnHeight |
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. |
} |
@@ -374,51 +343,6 @@ void MultiColumnFragmentainerGroup::setAndConstrainColumnHeight(LayoutUnit newHe |
m_columnHeight = m_maxColumnHeight; |
} |
-unsigned MultiColumnFragmentainerGroup::findRunWithTallestColumns() const |
-{ |
- unsigned indexWithLargestHeight = 0; |
- LayoutUnit largestHeight; |
- LayoutUnit previousOffset = m_logicalTopInFlowThread; |
- size_t runCount = m_contentRuns.size(); |
- ASSERT(runCount); |
- for (size_t i = 0; i < runCount; i++) { |
- const ContentRun& run = m_contentRuns[i]; |
- LayoutUnit height = run.columnLogicalHeight(previousOffset); |
- if (largestHeight < height) { |
- largestHeight = height; |
- indexWithLargestHeight = i; |
- } |
- previousOffset = run.breakOffset(); |
- } |
- return indexWithLargestHeight; |
-} |
- |
-void MultiColumnFragmentainerGroup::distributeImplicitBreaks() |
-{ |
-#if ENABLE(ASSERT) |
- // There should be no implicit breaks assumed at this point. |
- for (unsigned i = 0; i < m_contentRuns.size(); i++) |
- ASSERT(!m_contentRuns[i].assumedImplicitBreaks()); |
-#endif // ENABLE(ASSERT) |
- |
- // Insert a final content run to encompass all content. This will include overflow if this is |
- // the last set. |
- addContentRun(m_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 |
- // currently tallest columns will get another implicit break "inserted", which will increase its |
- // 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 (columnCount < m_columnSet.usedColumnCount()) { |
- unsigned index = findRunWithTallestColumns(); |
- m_contentRuns[index].assumeAnotherImplicitBreak(); |
- columnCount++; |
- } |
-} |
- |
LayoutUnit MultiColumnFragmentainerGroup::calculateColumnHeight(BalancedColumnHeightCalculation calculationMode) const |
{ |
if (calculationMode == GuessFromFlowThreadPortion) { |
@@ -426,9 +350,7 @@ LayoutUnit MultiColumnFragmentainerGroup::calculateColumnHeight(BalancedColumnHe |
// 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() : m_logicalTopInFlowThread; |
- return std::max<LayoutUnit>(m_contentRuns[index].columnLogicalHeight(startOffset), m_minimumColumnHeight); |
+ return std::max(InitialColumnHeightFinder::initialMinimalBalancedHeight(*this), m_minimumColumnHeight); |
} |
if (actualColumnCount() <= m_columnSet.usedColumnCount()) { |
@@ -436,12 +358,6 @@ LayoutUnit MultiColumnFragmentainerGroup::calculateColumnHeight(BalancedColumnHe |
return m_columnHeight; |
} |
- if (m_contentRuns.size() >= m_columnSet.usedColumnCount()) { |
- // 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_columnHeight; |
- } |
- |
if (m_columnHeight >= m_maxColumnHeight) { |
// We cannot stretch any further. We'll just have to live with the overflowing columns. This |
// typically happens if the max column height is less than the height of the tallest piece |
@@ -449,15 +365,24 @@ LayoutUnit MultiColumnFragmentainerGroup::calculateColumnHeight(BalancedColumnHe |
return m_columnHeight; |
} |
+ MinimumSpaceShortageFinder shortageFinder(*this); |
+ |
+ if (shortageFinder.forcedBreaksCount() + 1 >= m_columnSet.usedColumnCount()) { |
+ // 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_columnHeight; |
+ } |
+ |
// If the initial guessed column height wasn't enough, stretch it now. Stretch by the lowest |
- // amount of space shortage found during layout. |
+ // amount of space. |
+ LayoutUnit minSpaceShortage = shortageFinder.minimumSpaceShortage(); |
- ASSERT(m_minSpaceShortage > 0); // We should never _shrink_ the height! |
- ASSERT(m_minSpaceShortage != LayoutUnit::max()); // If this happens, we probably have a bug. |
- if (m_minSpaceShortage == LayoutUnit::max()) |
+ ASSERT(minSpaceShortage > 0); // We should never _shrink_ the height! |
+ ASSERT(minSpaceShortage != LayoutUnit::max()); // If this happens, we probably have a bug. |
+ if (minSpaceShortage == LayoutUnit::max()) |
return m_columnHeight; // So bail out rather than looping infinitely. |
- return m_columnHeight + m_minSpaceShortage; |
+ return m_columnHeight + minSpaceShortage; |
} |
LayoutRect MultiColumnFragmentainerGroup::columnRectAt(unsigned columnIndex) const |