Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Unified Diff: Source/core/rendering/RenderMultiColumnSet.h

Issue 143383002: Region based multicol: support explicit column breaks (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Code review. Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/rendering/RenderMultiColumnSet.h
diff --git a/Source/core/rendering/RenderMultiColumnSet.h b/Source/core/rendering/RenderMultiColumnSet.h
index 057f4bf260b6f1691628c3c51f0fffc748845d51..4ece7e3b9f68adf3fe2944548ecc159dc4e3b440 100644
--- a/Source/core/rendering/RenderMultiColumnSet.h
+++ b/Source/core/rendering/RenderMultiColumnSet.h
@@ -28,6 +28,7 @@
#define RenderMultiColumnSet_h
#include "core/rendering/RenderRegionSet.h"
+#include "wtf/Vector.h"
namespace WebCore {
@@ -62,30 +63,14 @@ public:
void updateMinimumColumnHeight(LayoutUnit height) { m_minimumColumnHeight = std::max(height, m_minimumColumnHeight); }
LayoutUnit minimumColumnHeight() const { return m_minimumColumnHeight; }
- unsigned forcedBreaksCount() const { return m_forcedBreaksCount; }
- LayoutUnit forcedBreakOffset() const { return m_forcedBreakOffset; }
- LayoutUnit maximumDistanceBetweenForcedBreaks() const { return m_maximumDistanceBetweenForcedBreaks; }
- void clearForcedBreaks()
- {
- m_forcedBreaksCount = 0;
- m_maximumDistanceBetweenForcedBreaks = 0;
- m_forcedBreakOffset = 0;
- }
- void addForcedBreak(LayoutUnit offsetFromFirstPage)
- {
- ASSERT(!computedColumnHeight());
- LayoutUnit distanceFromLastBreak = offsetFromFirstPage - m_forcedBreakOffset;
- if (!distanceFromLastBreak)
- return;
- m_forcedBreaksCount++;
- m_maximumDistanceBetweenForcedBreaks = std::max(m_maximumDistanceBetweenForcedBreaks, distanceFromLastBreak);
- m_forcedBreakOffset = offsetFromFirstPage;
- }
+ unsigned forcedBreaksCount() const { return m_contentRuns.size(); }
+ void clearForcedBreaks();
+ void addForcedBreak(LayoutUnit offsetFromFirstPage);
- // 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);
+ // (Re-)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 recalculateBalancedHeight(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
@@ -139,17 +124,52 @@ private:
void setAndConstrainColumnHeight(LayoutUnit);
- unsigned m_computedColumnCount;
- LayoutUnit m_computedColumnWidth;
+ // Return the index of the content run with the currently tallest columns, taking all implicit
+ // breaks assumed so far into account.
+ unsigned findRunWithTallestColumns() const;
+
+ // Given the current list of content runs, make assumptions about where we need to insert
+ // implicit breaks (if there's room for any at all; depending on the number of explicit breaks),
+ // and store the results. This is needed in order to balance the columns.
+ void distributeImplicitBreaks();
+
+ LayoutUnit calculateBalancedHeight(bool initial) const;
+
+ unsigned m_computedColumnCount; // Used column count (the resulting 'N' from the pseudo-algorithm in the multicol spec)
+ LayoutUnit m_computedColumnWidth; // Used column width (the resulting 'W' from the pseudo-algorithm in the multicol spec)
LayoutUnit m_computedColumnHeight;
// The following variables are used when balancing the column set.
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;
- LayoutUnit m_forcedBreakOffset;
+
+ // A run of content without explicit (forced) breaks; i.e. a flow thread portion between two
+ // explicit breaks, between flow thread start and an explicit break, between an explicit break
+ // and flow thread end, or, in cases when there are no explicit breaks at all: between flow flow
+ // thread start and flow thread end. We need to know where the explicit breaks are, in order to
+ // figure out where the implicit breaks will end up, so that we get the columns properly
+ // balanced. A content run starts out as representing one single column, and will represent one
+ // additional column for each implicit break "inserted" there.
+ class ContentRun {
+ public:
+ ContentRun(LayoutUnit breakOffset)
+ : m_breakOffset(breakOffset)
+ , m_assumedImplicitBreaks(0) { }
+
+ unsigned assumedImplicitBreaks() const { return m_assumedImplicitBreaks; }
+ void assumeAnotherImplicitBreak() { m_assumedImplicitBreaks++; }
+ LayoutUnit breakOffset() const { return m_breakOffset; }
+
+ // Return the column height that this content run would require, considering the implicit
+ // breaks assumed so far.
+ LayoutUnit columnLogicalHeight(LayoutUnit startOffset) const { return ceilf(float(m_breakOffset - startOffset) / float(m_assumedImplicitBreaks + 1)); }
+
+ private:
+ LayoutUnit m_breakOffset; // Flow thread offset where this run ends.
+ unsigned m_assumedImplicitBreaks; // Number of implicit breaks in this run assumed so far.
+ };
+ Vector<ContentRun, 1> m_contentRuns;
};
DEFINE_RENDER_OBJECT_TYPE_CASTS(RenderMultiColumnSet, isRenderMultiColumnSet());
« no previous file with comments | « Source/core/rendering/RenderMultiColumnFlowThread.cpp ('k') | Source/core/rendering/RenderMultiColumnSet.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698