OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/layout/MultiColumnFragmentainerGroup.h" | 5 #include "core/layout/MultiColumnFragmentainerGroup.h" |
6 | 6 |
7 namespace blink { | 7 namespace blink { |
8 | 8 |
9 // A column balancer traverses the portion of the subtree of a flow thread that
belongs to a given | 9 // A column balancer traverses the portion of the subtree of a flow thread that
belongs to a given |
10 // fragmentainer group, in order to collect certain data to be used for column b
alancing. This is an | 10 // fragmentainer group, in order to collect certain data to be used for column b
alancing. This is an |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 // After an initial layout pass, we know the height of the contents of a flow th
read. Based on | 55 // After an initial layout pass, we know the height of the contents of a flow th
read. Based on |
56 // this, we can estimate an initial minimal column height. This class will colle
ct the necessary | 56 // this, we can estimate an initial minimal column height. This class will colle
ct the necessary |
57 // information from the layout objects to make this estimate. This estimate may
be used to perform | 57 // information from the layout objects to make this estimate. This estimate may
be used to perform |
58 // another layout iteration. If we after such a layout iteration cannot fit the
contents with the | 58 // another layout iteration. If we after such a layout iteration cannot fit the
contents with the |
59 // given column height without creating overflowing columns, we will have to str
etch the columns by | 59 // given column height without creating overflowing columns, we will have to str
etch the columns by |
60 // some amount and lay out again. We may need to do this several times (but typi
cally not more | 60 // some amount and lay out again. We may need to do this several times (but typi
cally not more |
61 // times than the number of columns that we have). The amount to stretch is prov
ided by the sister | 61 // times than the number of columns that we have). The amount to stretch is prov
ided by the sister |
62 // of this class, named MinimumSpaceShortageFinder. | 62 // of this class, named MinimumSpaceShortageFinder. |
63 class InitialColumnHeightFinder final : public ColumnBalancer { | 63 class InitialColumnHeightFinder final : public ColumnBalancer { |
64 public: | 64 public: |
65 static LayoutUnit initialMinimalBalancedHeight(const MultiColumnFragmentaine
rGroup& group) | |
66 { | |
67 return InitialColumnHeightFinder(group).initialMinimalBalancedHeight(); | |
68 } | |
69 | |
70 private: | |
71 InitialColumnHeightFinder(const MultiColumnFragmentainerGroup&); | 65 InitialColumnHeightFinder(const MultiColumnFragmentainerGroup&); |
72 | 66 |
73 LayoutUnit initialMinimalBalancedHeight() const; | 67 LayoutUnit initialMinimalBalancedHeight() const; |
74 | 68 |
| 69 // Height of the tallest piece of unbreakable content. This is the minimum c
olumn logical height |
| 70 // required to avoid fragmentation where it shouldn't occur (inside unbreaka
ble content, between |
| 71 // orphans and widows, etc.). This will be used as a hint to the column bala
ncer to help set a |
| 72 // good initial column height. |
| 73 LayoutUnit tallestUnbreakableLogicalHeight() const { return m_tallestUnbreak
ableLogicalHeight; } |
| 74 |
| 75 private: |
75 void examineBoxAfterEntering(const LayoutBox&); | 76 void examineBoxAfterEntering(const LayoutBox&); |
76 void examineBoxBeforeLeaving(const LayoutBox&); | 77 void examineBoxBeforeLeaving(const LayoutBox&); |
77 void examineLine(const RootInlineBox&); | 78 void examineLine(const RootInlineBox&); |
78 | 79 |
79 // Record that there's a pagination strut that ends at the specified |offset
InFlowThread|, which | 80 // Record that there's a pagination strut that ends at the specified |offset
InFlowThread|, which |
80 // is an offset exactly at the top of some column. | 81 // is an offset exactly at the top of some column. |
81 void recordStrutBeforeOffset(LayoutUnit offsetInFlowThread, LayoutUnit strut
); | 82 void recordStrutBeforeOffset(LayoutUnit offsetInFlowThread, LayoutUnit strut
); |
82 | 83 |
83 // Return the accumulated space used by struts at all column boundaries prec
eding the specified | 84 // Return the accumulated space used by struts at all column boundaries prec
eding the specified |
84 // flowthread offset. | 85 // flowthread offset. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 // interested in the shortest one. For example, when having a float beside r
egular in-flow | 133 // interested in the shortest one. For example, when having a float beside r
egular in-flow |
133 // content, we end up with two parallel fragmentation flows [1]. The shortes
t strut found at a | 134 // content, we end up with two parallel fragmentation flows [1]. The shortes
t strut found at a |
134 // column boundary is the amount of space that we wasted at said column boun
dary, and it needs | 135 // column boundary is the amount of space that we wasted at said column boun
dary, and it needs |
135 // to be deducted when estimating the initial balanced column height, or we
risk making the | 136 // to be deducted when estimating the initial balanced column height, or we
risk making the |
136 // column row too tall. An entry set to LayoutUnit::max() means that we didn
't detect any object | 137 // column row too tall. An entry set to LayoutUnit::max() means that we didn
't detect any object |
137 // crossing that boundary. | 138 // crossing that boundary. |
138 // | 139 // |
139 // [1] http://www.w3.org/TR/css3-break/#parallel-flows | 140 // [1] http://www.w3.org/TR/css3-break/#parallel-flows |
140 Vector<LayoutUnit, 32> m_shortestStruts; | 141 Vector<LayoutUnit, 32> m_shortestStruts; |
141 | 142 |
142 LayoutUnit m_minimumColumnLogicalHeight; | 143 LayoutUnit m_tallestUnbreakableLogicalHeight; |
143 }; | 144 }; |
144 | 145 |
145 // If we have previously used InitialColumnHeightFinder to estimate an initial c
olumn height, and | 146 // If we have previously used InitialColumnHeightFinder to estimate an initial c
olumn height, and |
146 // that didn't result in tall enough columns, we need subsequent layout passes w
here we increase | 147 // that didn't result in tall enough columns, we need subsequent layout passes w
here we increase |
147 // the column height by the minimum space shortage at column breaks. This class
finds the minimum | 148 // the column height by the minimum space shortage at column breaks. This class
finds the minimum |
148 // space shortage after having laid out with the current column height. | 149 // space shortage after having laid out with the current column height. |
149 class MinimumSpaceShortageFinder final : public ColumnBalancer { | 150 class MinimumSpaceShortageFinder final : public ColumnBalancer { |
150 public: | 151 public: |
151 MinimumSpaceShortageFinder(const MultiColumnFragmentainerGroup&); | 152 MinimumSpaceShortageFinder(const MultiColumnFragmentainerGroup&); |
152 | 153 |
(...skipping 18 matching lines...) Expand all Loading... |
171 LayoutUnit m_minimumSpaceShortage; | 172 LayoutUnit m_minimumSpaceShortage; |
172 | 173 |
173 // Set when breaking before a block, and we're looking for the first unbreak
able descendant, in | 174 // Set when breaking before a block, and we're looking for the first unbreak
able descendant, in |
174 // order to report correct space shortage for that one. | 175 // order to report correct space shortage for that one. |
175 LayoutUnit m_pendingStrut; | 176 LayoutUnit m_pendingStrut; |
176 | 177 |
177 unsigned m_forcedBreaksCount; | 178 unsigned m_forcedBreaksCount; |
178 }; | 179 }; |
179 | 180 |
180 } // namespace blink | 181 } // namespace blink |
OLD | NEW |