| Index: third_party/WebKit/Source/core/layout/ColumnBalancer.h
|
| diff --git a/third_party/WebKit/Source/core/layout/ColumnBalancer.h b/third_party/WebKit/Source/core/layout/ColumnBalancer.h
|
| index 1d796a39c03b6e84be26def5917576466bec9ae8..4dd77f6c4465320ccdd3134108c19a6927856856 100644
|
| --- a/third_party/WebKit/Source/core/layout/ColumnBalancer.h
|
| +++ b/third_party/WebKit/Source/core/layout/ColumnBalancer.h
|
| @@ -6,11 +6,10 @@
|
|
|
| namespace blink {
|
|
|
| -// A column balancer traverses a portion of the subtree of a flow thread that
|
| -// belongs to one or more fragmentainer groups within one column set, in order
|
| -// to collect certain data to be used for column balancing. This is an abstract
|
| -// class that just walks the subtree and leaves it to subclasses to actually
|
| -// collect data.
|
| +// A column balancer traverses a portion of the subtree of a flow thread that belongs to one or
|
| +// more fragmentainer groups within one column set, in order to collect certain data to be used for
|
| +// column balancing. This is an abstract class that just walks the subtree and leaves it to
|
| +// subclasses to actually collect data.
|
| class ColumnBalancer {
|
| protected:
|
| ColumnBalancer(const LayoutMultiColumnSet&,
|
| @@ -19,8 +18,8 @@
|
|
|
| const LayoutMultiColumnSet& columnSet() const { return m_columnSet; }
|
|
|
| - // The flow thread portion we're examining. It may be that of the entire
|
| - // column set, or just of a fragmentainer group.
|
| + // The flow thread portion we're examining. It may be that of the entire column set, or just of
|
| + // a fragmentainer group.
|
| const LayoutUnit logicalTopInFlowThread() const {
|
| return m_logicalTopInFlowThread;
|
| }
|
| @@ -43,12 +42,12 @@
|
| // Flow thread offset for the layout object that we're currently examining.
|
| LayoutUnit flowThreadOffset() const { return m_flowThreadOffset; }
|
|
|
| - // Return true if the specified offset is at the top of a column, as long as
|
| - // it's not the first column in the flow thread portion.
|
| + // Return true if the specified offset is at the top of a column, as long as it's not the first
|
| + // column in the flow thread portion.
|
| bool isFirstAfterBreak(LayoutUnit flowThreadOffset) const {
|
| if (flowThreadOffset <= m_logicalTopInFlowThread) {
|
| - // The first column is either not after any break at all, or after a break
|
| - // in a previous fragmentainer group.
|
| + // The first column is either not after any break at all, or after a break in a
|
| + // previous fragmentainer group.
|
| return false;
|
| }
|
| return flowThreadOffset ==
|
| @@ -66,25 +65,22 @@
|
| logicalBottomInFlowThread <= m_logicalBottomInFlowThread;
|
| }
|
|
|
| - // Examine and collect column balancing data from a layout box that has been
|
| - // found to intersect with the flow thread portion we're examining. Does not
|
| - // recurse into children. flowThreadOffset() will return the offset from |box|
|
| - // to the flow thread. Two hooks are provided here. The first one is called
|
| - // right after entering and before traversing the subtree of the box, and the
|
| - // second one right after having traversed the subtree.
|
| + // Examine and collect column balancing data from a layout box that has been found to intersect
|
| + // with the flow thread portion we're examining. Does not recurse into
|
| + // children. flowThreadOffset() will return the offset from |box| to the flow thread. Two hooks
|
| + // are provided here. The first one is called right after entering and before traversing the
|
| + // subtree of the box, and the second one right after having traversed the subtree.
|
| virtual void examineBoxAfterEntering(const LayoutBox&,
|
| EBreak previousBreakAfterValue) = 0;
|
| virtual void examineBoxBeforeLeaving(const LayoutBox&) = 0;
|
|
|
| - // Examine and collect column balancing data from a line that has been found
|
| - // to intersect with the flow thread portion. Does not recurse into layout
|
| - // objects on that line.
|
| + // Examine and collect column balancing data from a line that has been found to intersect with
|
| + // the flow thread portion. Does not recurse into layout objects on that line.
|
| virtual void examineLine(const RootInlineBox&) = 0;
|
|
|
| - // Examine and collect column balancing data for everything in the flow thread
|
| - // portion. Will trigger calls to examineBoxAfterEntering(),
|
| - // examineBoxBeforeLeaving() and examineLine() for interesting boxes and
|
| - // lines.
|
| + // Examine and collect column balancing data for everything in the flow thread portion. Will
|
| + // trigger calls to examineBoxAfterEntering(), examineBoxBeforeLeaving() and examineLine() for
|
| + // interesting boxes and lines.
|
| void traverse();
|
|
|
| private:
|
| @@ -97,16 +93,14 @@
|
| LayoutUnit m_flowThreadOffset;
|
| };
|
|
|
| -// After an initial layout pass, we know the height of the contents of a flow
|
| -// thread. Based on this, we can estimate an initial minimal column height. This
|
| -// class will collect the necessary information from the layout objects to make
|
| -// this estimate. This estimate may be used to perform another layout iteration.
|
| -// If we after such a layout iteration cannot fit the contents with the given
|
| -// column height without creating overflowing columns, we will have to stretch
|
| -// the columns by some amount and lay out again. We may need to do this several
|
| -// times (but typically not more times than the number of columns that we have).
|
| -// The amount to stretch is provided by the sister of this class, named
|
| -// MinimumSpaceShortageFinder.
|
| +// After an initial layout pass, we know the height of the contents of a flow thread. Based on
|
| +// this, we can estimate an initial minimal column height. This class will collect the necessary
|
| +// information from the layout objects to make this estimate. This estimate may be used to perform
|
| +// another layout iteration. If we after such a layout iteration cannot fit the contents with the
|
| +// given column height without creating overflowing columns, we will have to stretch the columns by
|
| +// some amount and lay out again. We may need to do this several times (but typically not more
|
| +// times than the number of columns that we have). The amount to stretch is provided by the sister
|
| +// of this class, named MinimumSpaceShortageFinder.
|
| class InitialColumnHeightFinder final : public ColumnBalancer {
|
| public:
|
| InitialColumnHeightFinder(const LayoutMultiColumnSet&,
|
| @@ -115,11 +109,10 @@
|
|
|
| LayoutUnit initialMinimalBalancedHeight() const;
|
|
|
| - // Height of the tallest piece of unbreakable content. This is the minimum
|
| - // column logical height required to avoid fragmentation where it shouldn't
|
| - // occur (inside unbreakable content, between orphans and widows, etc.). This
|
| - // will be used as a hint to the column balancer to help set a good initial
|
| - // column height.
|
| + // Height of the tallest piece of unbreakable content. This is the minimum column logical height
|
| + // required to avoid fragmentation where it shouldn't occur (inside unbreakable content, between
|
| + // orphans and widows, etc.). This will be used as a hint to the column balancer to help set a
|
| + // good initial column height.
|
| LayoutUnit tallestUnbreakableLogicalHeight() const {
|
| return m_tallestUnbreakableLogicalHeight;
|
| }
|
| @@ -130,39 +123,36 @@
|
| void examineBoxBeforeLeaving(const LayoutBox&);
|
| void examineLine(const RootInlineBox&);
|
|
|
| - // Record that there's a pagination strut that ends at the specified
|
| - // |offsetInFlowThread|, which is an offset exactly at the top of some column.
|
| + // Record that there's a pagination strut that ends at the specified |offsetInFlowThread|, which
|
| + // is an offset exactly at the top of some column.
|
| void recordStrutBeforeOffset(LayoutUnit offsetInFlowThread, LayoutUnit strut);
|
|
|
| - // Return the accumulated space used by struts at all column boundaries
|
| - // preceding the specified flowthread offset.
|
| + // Return the accumulated space used by struts at all column boundaries preceding the specified
|
| + // flowthread offset.
|
| LayoutUnit spaceUsedByStrutsAt(LayoutUnit offsetInFlowThread) const;
|
|
|
| - // Add a content run, specified by its end position. A content run is appended
|
| - // at every forced/explicit break and at the end of the column set. The
|
| - // content runs are used to determine where implicit/soft breaks will occur,
|
| - // in order to calculate an initial column height.
|
| + // Add a content run, specified by its end position. A content run is appended at every
|
| + // forced/explicit break and at the end of the column set. The content runs are used to
|
| + // determine where implicit/soft breaks will occur, in order to calculate an initial column
|
| + // height.
|
| void addContentRun(LayoutUnit endOffsetInFlowThread);
|
|
|
| - // Return the index of the content run with the currently tallest columns,
|
| - // taking all implicit breaks assumed so far into account.
|
| + // Return the index of the content run with the currently tallest columns, taking all implicit
|
| + // breaks assumed so far into account.
|
| unsigned contentRunIndexWithTallestColumns() 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.
|
| + // 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();
|
|
|
| - // 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 thread portion start
|
| - // and flow thread portion 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.
|
| + // 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
|
| + // thread portion start and flow thread portion 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)
|
| @@ -172,8 +162,8 @@
|
| 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.
|
| + // Return the column height that this content run would require, considering the implicit
|
| + // breaks assumed so far.
|
| LayoutUnit columnLogicalHeight(LayoutUnit startOffset) const {
|
| return LayoutUnit::fromFloatCeil(float(m_breakOffset - startOffset) /
|
| float(m_assumedImplicitBreaks + 1));
|
| @@ -181,21 +171,19 @@
|
|
|
| private:
|
| LayoutUnit m_breakOffset; // Flow thread offset where this run ends.
|
| - unsigned m_assumedImplicitBreaks; // Number of implicit breaks in this run
|
| - // assumed so far.
|
| + unsigned
|
| + m_assumedImplicitBreaks; // Number of implicit breaks in this run assumed so far.
|
| };
|
| Vector<ContentRun, 32> m_contentRuns;
|
|
|
| - // Shortest strut found at each column boundary (index 0 being the boundary
|
| - // between the first and the second column, index 1 being the one between the
|
| - // second and the third boundary, and so on). There may be several objects
|
| - // that cross the same column boundary, and we're only interested in the
|
| - // shortest one. For example, when having a float beside regular in-flow
|
| - // content, we end up with two parallel fragmentation flows [1]. The shortest
|
| - // strut found at a column boundary is the amount of space that we wasted at
|
| - // said column boundary, and it needs to be deducted when estimating the
|
| - // initial balanced column height, or we risk making the column row too tall.
|
| - // An entry set to LayoutUnit::max() means that we didn't detect any object
|
| + // Shortest strut found at each column boundary (index 0 being the boundary between the first
|
| + // and the second column, index 1 being the one between the second and the third boundary, and
|
| + // so on). There may be several objects that cross the same column boundary, and we're only
|
| + // interested in the shortest one. For example, when having a float beside regular in-flow
|
| + // content, we end up with two parallel fragmentation flows [1]. The shortest strut found at a
|
| + // column boundary is the amount of space that we wasted at said column boundary, and it needs
|
| + // to be deducted when estimating the initial balanced column height, or we risk making the
|
| + // column row too tall. An entry set to LayoutUnit::max() means that we didn't detect any object
|
| // crossing that boundary.
|
| //
|
| // [1] http://www.w3.org/TR/css3-break/#parallel-flows
|
| @@ -204,11 +192,10 @@
|
| LayoutUnit m_tallestUnbreakableLogicalHeight;
|
| };
|
|
|
| -// If we have previously used InitialColumnHeightFinder to estimate an initial
|
| -// column height, and that didn't result in tall enough columns, we need
|
| -// subsequent layout passes where we increase the column height by the minimum
|
| -// space shortage at column breaks. This class finds the minimum space shortage
|
| -// after having laid out with the current column height.
|
| +// If we have previously used InitialColumnHeightFinder to estimate an initial column height, and
|
| +// that didn't result in tall enough columns, we need subsequent layout passes where we increase
|
| +// the column height by the minimum space shortage at column breaks. This class finds the minimum
|
| +// space shortage after having laid out with the current column height.
|
| class MinimumSpaceShortageFinder final : public ColumnBalancer {
|
| public:
|
| MinimumSpaceShortageFinder(const LayoutMultiColumnSet&,
|
| @@ -225,9 +212,9 @@
|
| void examineLine(const RootInlineBox&);
|
|
|
| void recordSpaceShortage(LayoutUnit shortage) {
|
| - // Only positive values are interesting (and allowed) here. Zero space
|
| - // shortage may be reported when we're at the top of a column and the
|
| - // element has zero height.
|
| + // Only positive values are interesting (and allowed) here. Zero space shortage may
|
| + // be reported when we're at the top of a column and the element has zero
|
| + // height.
|
| if (shortage > 0)
|
| m_minimumSpaceShortage = std::min(m_minimumSpaceShortage, shortage);
|
| }
|
| @@ -235,9 +222,8 @@
|
| // The smallest amout of space shortage that caused a column break.
|
| LayoutUnit m_minimumSpaceShortage;
|
|
|
| - // Set when breaking before a block, and we're looking for the first
|
| - // unbreakable descendant, in order to report correct space shortage for that
|
| - // one.
|
| + // Set when breaking before a block, and we're looking for the first unbreakable descendant, in
|
| + // order to report correct space shortage for that one.
|
| LayoutUnit m_pendingStrut;
|
|
|
| unsigned m_forcedBreaksCount;
|
|
|