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 #ifndef MultiColumnFragmentainerGroup_h | 5 #ifndef MultiColumnFragmentainerGroup_h |
6 #define MultiColumnFragmentainerGroup_h | 6 #define MultiColumnFragmentainerGroup_h |
7 | 7 |
8 #include "core/layout/LayoutMultiColumnFlowThread.h" | 8 #include "core/layout/LayoutMultiColumnFlowThread.h" |
9 #include "wtf/Allocator.h" | 9 #include "wtf/Allocator.h" |
10 | 10 |
11 namespace blink { | 11 namespace blink { |
12 | 12 |
13 // A group of columns, that are laid out in the inline progression direction, al
l with the same | 13 // A group of columns, that are laid out in the inline progression direction, |
14 // column height. | 14 // all with the same column height. |
15 // | 15 // |
16 // When a multicol container is inside another fragmentation context, and said m
ulticol container | 16 // When a multicol container is inside another fragmentation context, and said |
17 // lives in multiple outer fragmentainers (pages / columns), we need to put thes
e inner columns into | 17 // multicol container lives in multiple outer fragmentainers (pages / columns), |
18 // separate groups, with one group per outer fragmentainer. Such a group of colu
mns is what | 18 // we need to put these inner columns into separate groups, with one group per |
19 // comprises a "row of column boxes" in spec lingo. | 19 // outer fragmentainer. Such a group of columns is what comprises a "row of |
| 20 // column boxes" in spec lingo. |
20 // | 21 // |
21 // Column balancing, when enabled, takes place within a column fragmentainer gro
up. | 22 // Column balancing, when enabled, takes place within a column fragmentainer |
| 23 // group. |
22 // | 24 // |
23 // Each fragmentainer group may have its own actual column count (if there are u
nused columns | 25 // Each fragmentainer group may have its own actual column count (if there are |
24 // because of forced breaks, for example). If there are multiple fragmentainer g
roups, the actual | 26 // unused columns because of forced breaks, for example). If there are multiple |
25 // column count must not exceed the used column count (the one calculated based
on column-count and | 27 // fragmentainer groups, the actual column count must not exceed the used column |
26 // column-width from CSS), or they'd overflow the outer fragmentainer in the inl
ine direction. If we | 28 // count (the one calculated based on column-count and column-width from CSS), |
27 // need more columns than what a group has room for, we'll create another group
and put them there | 29 // or they'd overflow the outer fragmentainer in the inline direction. If we |
28 // (and make them appear in the next outer fragmentainer). | 30 // need more columns than what a group has room for, we'll create another group |
| 31 // and put them there (and make them appear in the next outer fragmentainer). |
29 class MultiColumnFragmentainerGroup { | 32 class MultiColumnFragmentainerGroup { |
30 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); | 33 DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); |
31 | 34 |
32 public: | 35 public: |
33 MultiColumnFragmentainerGroup(const LayoutMultiColumnSet&); | 36 MultiColumnFragmentainerGroup(const LayoutMultiColumnSet&); |
34 | 37 |
35 const LayoutMultiColumnSet& columnSet() const { return m_columnSet; } | 38 const LayoutMultiColumnSet& columnSet() const { return m_columnSet; } |
36 | 39 |
37 bool isFirstGroup() const; | 40 bool isFirstGroup() const; |
38 bool isLastGroup() const; | 41 bool isLastGroup() const; |
39 | 42 |
40 // Position within the LayoutMultiColumnSet. | 43 // Position within the LayoutMultiColumnSet. |
41 LayoutUnit logicalTop() const { return m_logicalTop; } | 44 LayoutUnit logicalTop() const { return m_logicalTop; } |
42 void setLogicalTop(LayoutUnit logicalTop) { m_logicalTop = logicalTop; } | 45 void setLogicalTop(LayoutUnit logicalTop) { m_logicalTop = logicalTop; } |
43 | 46 |
44 LayoutUnit logicalHeight() const { return m_columnHeight; } | 47 LayoutUnit logicalHeight() const { return m_columnHeight; } |
45 | 48 |
46 LayoutSize offsetFromColumnSet() const; | 49 LayoutSize offsetFromColumnSet() const; |
47 | 50 |
48 // Return the block offset from the enclosing fragmentation context, if nested
. In the | 51 // Return the block offset from the enclosing fragmentation context, if |
49 // coordinate space of the enclosing fragmentation context. | 52 // nested. In the coordinate space of the enclosing fragmentation context. |
50 LayoutUnit blockOffsetInEnclosingFragmentationContext() const; | 53 LayoutUnit blockOffsetInEnclosingFragmentationContext() const; |
51 | 54 |
52 // The top of our flow thread portion | 55 // The top of our flow thread portion |
53 LayoutUnit logicalTopInFlowThread() const { return m_logicalTopInFlowThread; } | 56 LayoutUnit logicalTopInFlowThread() const { return m_logicalTopInFlowThread; } |
54 void setLogicalTopInFlowThread(LayoutUnit logicalTopInFlowThread) { | 57 void setLogicalTopInFlowThread(LayoutUnit logicalTopInFlowThread) { |
55 m_logicalTopInFlowThread = logicalTopInFlowThread; | 58 m_logicalTopInFlowThread = logicalTopInFlowThread; |
56 } | 59 } |
57 | 60 |
58 // The bottom of our flow thread portion | 61 // The bottom of our flow thread portion |
59 LayoutUnit logicalBottomInFlowThread() const { | 62 LayoutUnit logicalBottomInFlowThread() const { |
(...skipping 25 matching lines...) Expand all Loading... |
85 LayoutRect flowThreadPortionOverflowRectAt(unsigned columnIndex) const; | 88 LayoutRect flowThreadPortionOverflowRectAt(unsigned columnIndex) const; |
86 | 89 |
87 // Get the first and the last column intersecting the specified block range. | 90 // Get the first and the last column intersecting the specified block range. |
88 // Note that |logicalBottomInFlowThread| is an exclusive endpoint. | 91 // Note that |logicalBottomInFlowThread| is an exclusive endpoint. |
89 void columnIntervalForBlockRangeInFlowThread( | 92 void columnIntervalForBlockRangeInFlowThread( |
90 LayoutUnit logicalTopInFlowThread, | 93 LayoutUnit logicalTopInFlowThread, |
91 LayoutUnit logicalBottomInFlowThread, | 94 LayoutUnit logicalBottomInFlowThread, |
92 unsigned& firstColumn, | 95 unsigned& firstColumn, |
93 unsigned& lastColumn) const; | 96 unsigned& lastColumn) const; |
94 | 97 |
95 // Get the first and the last column intersecting the specified visual rectang
le. | 98 // Get the first and the last column intersecting the specified visual |
| 99 // rectangle. |
96 void columnIntervalForVisualRect(const LayoutRect&, | 100 void columnIntervalForVisualRect(const LayoutRect&, |
97 unsigned& firstColumn, | 101 unsigned& firstColumn, |
98 unsigned& lastColumn) const; | 102 unsigned& lastColumn) const; |
99 | 103 |
100 LayoutRect calculateOverflow() const; | 104 LayoutRect calculateOverflow() const; |
101 | 105 |
102 unsigned columnIndexAtOffset(LayoutUnit offsetInFlowThread, | 106 unsigned columnIndexAtOffset(LayoutUnit offsetInFlowThread, |
103 LayoutBox::PageBoundaryRule) const; | 107 LayoutBox::PageBoundaryRule) const; |
104 | 108 |
105 // The "CSS actual" value of column-count. This includes overflowing columns,
if any. | 109 // The "CSS actual" value of column-count. This includes overflowing columns, |
| 110 // if any. |
106 // Returns 1 or greater, never 0. | 111 // Returns 1 or greater, never 0. |
107 unsigned actualColumnCount() const; | 112 unsigned actualColumnCount() const; |
108 | 113 |
109 private: | 114 private: |
110 LayoutUnit heightAdjustedForRowOffset(LayoutUnit height) const; | 115 LayoutUnit heightAdjustedForRowOffset(LayoutUnit height) const; |
111 LayoutUnit calculateMaxColumnHeight() const; | 116 LayoutUnit calculateMaxColumnHeight() const; |
112 void setAndConstrainColumnHeight(LayoutUnit); | 117 void setAndConstrainColumnHeight(LayoutUnit); |
113 | 118 |
114 LayoutUnit rebalanceColumnHeightIfNeeded() const; | 119 LayoutUnit rebalanceColumnHeightIfNeeded() const; |
115 | 120 |
116 LayoutRect columnRectAt(unsigned columnIndex) const; | 121 LayoutRect columnRectAt(unsigned columnIndex) const; |
117 LayoutUnit logicalTopInFlowThreadAt(unsigned columnIndex) const { | 122 LayoutUnit logicalTopInFlowThreadAt(unsigned columnIndex) const { |
118 return m_logicalTopInFlowThread + columnIndex * m_columnHeight; | 123 return m_logicalTopInFlowThread + columnIndex * m_columnHeight; |
119 } | 124 } |
120 | 125 |
121 // Return the column that the specified visual point belongs to. Only the coor
dinate on the | 126 // Return the column that the specified visual point belongs to. Only the |
122 // column progression axis is relevant. Every point belongs to a column, even
if said point is | 127 // coordinate on the column progression axis is relevant. Every point belongs |
123 // not inside any of the columns. | 128 // to a column, even if said point is not inside any of the columns. |
124 unsigned columnIndexAtVisualPoint(const LayoutPoint& visualPoint) const; | 129 unsigned columnIndexAtVisualPoint(const LayoutPoint& visualPoint) const; |
125 | 130 |
126 const LayoutMultiColumnSet& m_columnSet; | 131 const LayoutMultiColumnSet& m_columnSet; |
127 | 132 |
128 LayoutUnit m_logicalTop; | 133 LayoutUnit m_logicalTop; |
129 LayoutUnit m_logicalTopInFlowThread; | 134 LayoutUnit m_logicalTopInFlowThread; |
130 LayoutUnit m_logicalBottomInFlowThread; | 135 LayoutUnit m_logicalBottomInFlowThread; |
131 | 136 |
132 LayoutUnit m_columnHeight; | 137 LayoutUnit m_columnHeight; |
133 | 138 |
134 LayoutUnit m_maxColumnHeight; // Maximum column height allowed. | 139 LayoutUnit m_maxColumnHeight; // Maximum column height allowed. |
135 }; | 140 }; |
136 | 141 |
137 // List of all fragmentainer groups within a column set. There will always be at
least one | 142 // List of all fragmentainer groups within a column set. There will always be at |
138 // group. Deleting the one group is not allowed (or possible). There will be mor
e than one group if | 143 // least one group. Deleting the one group is not allowed (or possible). There |
139 // the owning column set lives in multiple outer fragmentainers (e.g. multicol i
nside paged media). | 144 // will be more than one group if the owning column set lives in multiple outer |
| 145 // fragmentainers (e.g. multicol inside paged media). |
140 class CORE_EXPORT MultiColumnFragmentainerGroupList { | 146 class CORE_EXPORT MultiColumnFragmentainerGroupList { |
141 DISALLOW_NEW(); | 147 DISALLOW_NEW(); |
142 | 148 |
143 public: | 149 public: |
144 MultiColumnFragmentainerGroupList(LayoutMultiColumnSet&); | 150 MultiColumnFragmentainerGroupList(LayoutMultiColumnSet&); |
145 ~MultiColumnFragmentainerGroupList(); | 151 ~MultiColumnFragmentainerGroupList(); |
146 | 152 |
147 // Add an additional fragmentainer group to the end of the list, and return it
. | 153 // Add an additional fragmentainer group to the end of the list, and return |
| 154 // it. |
148 MultiColumnFragmentainerGroup& addExtraGroup(); | 155 MultiColumnFragmentainerGroup& addExtraGroup(); |
149 | 156 |
150 // Remove all fragmentainer groups but the first one. | 157 // Remove all fragmentainer groups but the first one. |
151 void deleteExtraGroups(); | 158 void deleteExtraGroups(); |
152 | 159 |
153 MultiColumnFragmentainerGroup& first() { return m_groups.first(); } | 160 MultiColumnFragmentainerGroup& first() { return m_groups.first(); } |
154 const MultiColumnFragmentainerGroup& first() const { | 161 const MultiColumnFragmentainerGroup& first() const { |
155 return m_groups.first(); | 162 return m_groups.first(); |
156 } | 163 } |
157 MultiColumnFragmentainerGroup& last() { return m_groups.last(); } | 164 MultiColumnFragmentainerGroup& last() { return m_groups.last(); } |
(...skipping 21 matching lines...) Expand all Loading... |
179 | 186 |
180 private: | 187 private: |
181 LayoutMultiColumnSet& m_columnSet; | 188 LayoutMultiColumnSet& m_columnSet; |
182 | 189 |
183 Vector<MultiColumnFragmentainerGroup, 1> m_groups; | 190 Vector<MultiColumnFragmentainerGroup, 1> m_groups; |
184 }; | 191 }; |
185 | 192 |
186 } // namespace blink | 193 } // namespace blink |
187 | 194 |
188 #endif // MultiColumnFragmentainerGroup_h | 195 #endif // MultiColumnFragmentainerGroup_h |
OLD | NEW |