Index: Source/core/rendering/RenderMultiColumnSet.h |
diff --git a/Source/core/rendering/RenderMultiColumnSet.h b/Source/core/rendering/RenderMultiColumnSet.h |
index bd5b0cd52b07573b6bbe1e325ee7d0fc2699fb1e..a0d27926fae36e4c24f7a4bc4a8118d3a9c1c051 100644 |
--- a/Source/core/rendering/RenderMultiColumnSet.h |
+++ b/Source/core/rendering/RenderMultiColumnSet.h |
@@ -56,10 +56,8 @@ public: |
m_computedColumnWidth = width; |
m_computedColumnCount = count; |
} |
- void setComputedColumnHeight(LayoutUnit height) |
- { |
- m_computedColumnHeight = height; |
- } |
+ |
+ LayoutUnit heightAdjustedForSetOffset(LayoutUnit height) const; |
void updateMinimumColumnHeight(LayoutUnit height) { m_minimumColumnHeight = std::max(height, m_minimumColumnHeight); } |
LayoutUnit minimumColumnHeight() const { return m_minimumColumnHeight; } |
@@ -84,12 +82,21 @@ public: |
m_forcedBreakOffset = offsetFromFirstPage; |
} |
- bool requiresBalancing() const { return m_requiresBalancing; } |
- void setRequiresBalancing(bool balancing) { m_requiresBalancing = balancing; } |
+ // Calculate the column height when contents are supposed to be balanced. If 'initial' is set, |
+ // guess an initial column height; otherwise, stretch the column height a tad. Return true if |
+ // column height changed and another layout pass is required. |
+ bool calculateBalancedHeight(bool initial); |
+ |
+ // Record space shortage (the amount of space that would have been enough to prevent some |
+ // element from being moved to the next column) at a column break. The smallest amount of space |
+ // shortage we find is the amount with which we will stretch the column height, if it turns out |
+ // after layout that the columns weren't tall enough. |
+ void recordSpaceShortage(LayoutUnit spaceShortage); |
virtual void updateLogicalWidth() OVERRIDE; |
- virtual void updateLogicalHeight() OVERRIDE; |
- |
+ |
+ void prepareForLayout(); |
+ |
private: |
RenderMultiColumnSet(RenderFlowThread*); |
@@ -123,15 +130,22 @@ private: |
LayoutRect flowThreadPortionRectAt(unsigned index) const; |
LayoutRect flowThreadPortionOverflowRect(const LayoutRect& flowThreadPortion, unsigned index, unsigned colCount, LayoutUnit colGap) const; |
- |
- unsigned columnIndexAtOffset(LayoutUnit) const; |
- |
+ |
+ enum ColumnIndexCalculationMode { |
+ ClampToExistingColumns, // Stay within the range of already existing columns. |
+ AssumeNewColumns // Allow column indices outside the range of already existing columns. |
+ }; |
+ unsigned columnIndexAtOffset(LayoutUnit, ColumnIndexCalculationMode = ClampToExistingColumns) const; |
+ |
+ void setAndConstrainColumnHeight(LayoutUnit); |
+ |
unsigned m_computedColumnCount; |
LayoutUnit m_computedColumnWidth; |
LayoutUnit m_computedColumnHeight; |
// The following variables are used when balancing the column set. |
- bool m_requiresBalancing; // Whether or not the columns in the column set have to be balanced, i.e., made to be similar logical heights. |
+ LayoutUnit m_maxColumnHeight; // Maximum column height allowed. |
+ LayoutUnit m_minSpaceShortage; // The smallest amout of space shortage that caused a column break. |
LayoutUnit m_minimumColumnHeight; |
unsigned m_forcedBreaksCount; // FIXME: We will ultimately need to cache more information to balance around forced breaks properly. |
LayoutUnit m_maximumDistanceBetweenForcedBreaks; |