OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/ng/ng_block_layout_algorithm.h" | 5 #include "core/layout/ng/ng_block_layout_algorithm.h" |
6 | 6 |
7 #include "core/layout/ng/ng_absolute_utils.h" | 7 #include "core/layout/ng/ng_absolute_utils.h" |
8 #include "core/layout/ng/ng_block_break_token.h" | 8 #include "core/layout/ng/ng_block_break_token.h" |
9 #include "core/layout/ng/ng_block_child_iterator.h" | 9 #include "core/layout/ng/ng_block_child_iterator.h" |
10 #include "core/layout/ng/ng_box_fragment.h" | 10 #include "core/layout/ng/ng_box_fragment.h" |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 156 } |
157 return opportunity; | 157 return opportunity; |
158 } | 158 } |
159 | 159 |
160 // Calculates the logical offset for opportunity. | 160 // Calculates the logical offset for opportunity. |
161 NGLogicalOffset CalculateLogicalOffsetForOpportunity( | 161 NGLogicalOffset CalculateLogicalOffsetForOpportunity( |
162 const NGLayoutOpportunity& opportunity, | 162 const NGLayoutOpportunity& opportunity, |
163 const LayoutUnit float_offset, | 163 const LayoutUnit float_offset, |
164 const NGLogicalOffset& from_offset, | 164 const NGLogicalOffset& from_offset, |
165 NGFloatingObject* floating_object) { | 165 NGFloatingObject* floating_object) { |
| 166 DCHECK(floating_object); |
166 auto margins = floating_object->margins; | 167 auto margins = floating_object->margins; |
167 // Adjust to child's margin. | 168 // Adjust to child's margin. |
168 LayoutUnit inline_offset = margins.inline_start; | 169 LayoutUnit inline_offset = margins.inline_start; |
169 LayoutUnit block_offset = margins.block_start; | 170 LayoutUnit block_offset = margins.block_start; |
170 | 171 |
171 // Offset from the opportunity's block/inline start. | 172 // Offset from the opportunity's block/inline start. |
172 inline_offset += opportunity.offset.inline_offset; | 173 inline_offset += opportunity.offset.inline_offset; |
173 block_offset += opportunity.offset.block_offset; | 174 block_offset += opportunity.offset.block_offset; |
174 | 175 |
175 // Adjust to float: right offset if needed. | 176 // Adjust to float: right offset if needed. |
176 inline_offset += float_offset; | 177 inline_offset += float_offset; |
177 | 178 |
178 block_offset -= from_offset.block_offset; | 179 block_offset -= from_offset.block_offset; |
179 inline_offset -= from_offset.inline_offset; | 180 inline_offset -= from_offset.inline_offset; |
180 | 181 |
181 return NGLogicalOffset(inline_offset, block_offset); | 182 return NGLogicalOffset(inline_offset, block_offset); |
182 } | 183 } |
183 | 184 |
184 // Calculates the relative position from {@code from_offset} of the | 185 // Calculates the relative position from {@code from_offset} of the |
185 // floating object that is requested to be positioned from {@code origin_point}. | 186 // floating object that is requested to be positioned from {@code origin_point}. |
186 NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, | 187 NGLogicalOffset PositionFloat(const NGLogicalOffset& origin_point, |
187 const NGLogicalOffset& from_offset, | 188 const NGLogicalOffset& from_offset, |
188 NGFloatingObject* floating_object, | 189 NGFloatingObject* floating_object, |
189 NGConstraintSpace* new_parent_space) { | 190 NGConstraintSpace* new_parent_space) { |
| 191 DCHECK(floating_object); |
190 const auto* float_space = floating_object->space.get(); | 192 const auto* float_space = floating_object->space.get(); |
191 DCHECK(floating_object->fragment) << "Fragment cannot be null here"; | 193 DCHECK(floating_object->fragment) << "Fragment cannot be null here"; |
192 | 194 |
193 // TODO(ikilpatrick): The writing mode switching here looks wrong. | 195 // TODO(ikilpatrick): The writing mode switching here looks wrong. |
194 NGBoxFragment float_fragment( | 196 NGBoxFragment float_fragment( |
195 float_space->WritingMode(), | 197 float_space->WritingMode(), |
196 toNGPhysicalBoxFragment(floating_object->fragment.get())); | 198 toNGPhysicalBoxFragment(floating_object->fragment.get())); |
197 | 199 |
198 // Find a layout opportunity that will fit our float. | 200 // Find a layout opportunity that will fit our float. |
199 const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment( | 201 const NGLayoutOpportunity opportunity = FindLayoutOpportunityForFragment( |
(...skipping 13 matching lines...) Expand all Loading... |
213 float_fragment, opportunity, float_offset, floating_object->margins, | 215 float_fragment, opportunity, float_offset, floating_object->margins, |
214 floating_object->exclusion_type); | 216 floating_object->exclusion_type); |
215 new_parent_space->AddExclusion(exclusion); | 217 new_parent_space->AddExclusion(exclusion); |
216 | 218 |
217 return CalculateLogicalOffsetForOpportunity(opportunity, float_offset, | 219 return CalculateLogicalOffsetForOpportunity(opportunity, float_offset, |
218 from_offset, floating_object); | 220 from_offset, floating_object); |
219 } | 221 } |
220 | 222 |
221 // Updates the Floating Object's left offset from the provided parent_space | 223 // Updates the Floating Object's left offset from the provided parent_space |
222 // and {@code floating_object}'s space and margins. | 224 // and {@code floating_object}'s space and margins. |
223 void UpdateFloatingObjectLeftOffset( | 225 void UpdateFloatingObjectLeftOffset(const NGConstraintSpace& new_parent_space, |
224 const NGConstraintSpace& new_parent_space, | 226 const NGLogicalOffset& float_logical_offset, |
225 const Persistent<NGFloatingObject>& floating_object, | 227 NGFloatingObject* floating_object) { |
226 const NGLogicalOffset& float_logical_offset) { | 228 DCHECK(floating_object); |
227 // TODO(glebl): We should use physical offset here. | 229 // TODO(glebl): We should use physical offset here. |
228 floating_object->left_offset = | 230 floating_object->left_offset = |
229 floating_object->original_parent_space->BfcOffset().inline_offset - | 231 floating_object->original_parent_space->BfcOffset().inline_offset - |
230 new_parent_space.BfcOffset().inline_offset + | 232 new_parent_space.BfcOffset().inline_offset + |
231 float_logical_offset.inline_offset; | 233 float_logical_offset.inline_offset; |
232 } | 234 } |
233 | 235 |
234 // Positions pending floats stored on the fragment builder starting from | 236 // Positions pending floats stored on the fragment builder starting from |
235 // {@code origin_point_block_offset}. | 237 // {@code origin_point_block_offset}. |
236 void PositionPendingFloats(const LayoutUnit origin_point_block_offset, | 238 void PositionPendingFloats(const LayoutUnit origin_point_block_offset, |
237 NGConstraintSpace* new_parent_space, | 239 NGConstraintSpace* new_parent_space, |
238 NGFragmentBuilder* builder) { | 240 NGFragmentBuilder* builder) { |
239 DCHECK(builder->BfcOffset()) << "Parent BFC offset should be known here"; | 241 DCHECK(builder->BfcOffset()) << "Parent BFC offset should be known here"; |
240 LayoutUnit bfc_block_offset = builder->BfcOffset().value().block_offset; | 242 LayoutUnit bfc_block_offset = builder->BfcOffset().value().block_offset; |
241 | 243 |
242 for (auto& floating_object : builder->UnpositionedFloats()) { | 244 for (auto& floating_object : builder->UnpositionedFloats()) { |
243 const auto* float_space = floating_object->space.get(); | 245 const auto* float_space = floating_object->space.get(); |
244 const NGConstraintSpace* original_parent_space = | 246 const NGConstraintSpace* original_parent_space = |
245 floating_object->original_parent_space.get(); | 247 floating_object->original_parent_space.get(); |
246 | 248 |
247 NGLogicalOffset origin_point = {float_space->BfcOffset().inline_offset, | 249 NGLogicalOffset origin_point = {float_space->BfcOffset().inline_offset, |
248 origin_point_block_offset}; | 250 origin_point_block_offset}; |
249 NGLogicalOffset from_offset = { | 251 NGLogicalOffset from_offset = { |
250 original_parent_space->BfcOffset().inline_offset, bfc_block_offset}; | 252 original_parent_space->BfcOffset().inline_offset, bfc_block_offset}; |
251 | 253 |
252 NGLogicalOffset float_fragment_offset = PositionFloat( | 254 NGLogicalOffset float_fragment_offset = PositionFloat( |
253 origin_point, from_offset, floating_object, new_parent_space); | 255 origin_point, from_offset, floating_object.get(), new_parent_space); |
254 builder->AddFloatingObject(floating_object, float_fragment_offset); | 256 builder->AddFloatingObject(floating_object, float_fragment_offset); |
255 UpdateFloatingObjectLeftOffset(*new_parent_space, floating_object, | 257 UpdateFloatingObjectLeftOffset(*new_parent_space, float_fragment_offset, |
256 float_fragment_offset); | 258 floating_object.get()); |
257 } | 259 } |
258 builder->MutableUnpositionedFloats().clear(); | 260 builder->MutableUnpositionedFloats().clear(); |
259 } | 261 } |
260 | 262 |
261 // Whether an in-flow block-level child creates a new formatting context. | 263 // Whether an in-flow block-level child creates a new formatting context. |
262 // | 264 // |
263 // This will *NOT* check the following cases: | 265 // This will *NOT* check the following cases: |
264 // - The child is out-of-flow, e.g. floating or abs-pos. | 266 // - The child is out-of-flow, e.g. floating or abs-pos. |
265 // - The child is a inline-level, e.g. "display: inline-block". | 267 // - The child is a inline-level, e.g. "display: inline-block". |
266 // - The child establishes a new formatting context, but should be a child of | 268 // - The child establishes a new formatting context, but should be a child of |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 toNGPhysicalBoxFragment(layout_result->PhysicalFragment().get())); | 529 toNGPhysicalBoxFragment(layout_result->PhysicalFragment().get())); |
528 | 530 |
529 // Pull out unpositioned floats to the current fragment. This may needed if | 531 // Pull out unpositioned floats to the current fragment. This may needed if |
530 // for example the child fragment could not position its floats because it's | 532 // for example the child fragment could not position its floats because it's |
531 // empty and therefore couldn't determine its position in space. | 533 // empty and therefore couldn't determine its position in space. |
532 builder_.MutableUnpositionedFloats().appendVector( | 534 builder_.MutableUnpositionedFloats().appendVector( |
533 layout_result->UnpositionedFloats()); | 535 layout_result->UnpositionedFloats()); |
534 | 536 |
535 if (child->Type() == NGLayoutInputNode::kLegacyBlock && | 537 if (child->Type() == NGLayoutInputNode::kLegacyBlock && |
536 toNGBlockNode(child)->Style().isFloating()) { | 538 toNGBlockNode(child)->Style().isFloating()) { |
537 NGFloatingObject* floating_object = new NGFloatingObject( | 539 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create( |
538 child_space, constraint_space_, toNGBlockNode(child)->Style(), | 540 child_space, constraint_space_, toNGBlockNode(child)->Style(), |
539 curr_child_margins_, layout_result->PhysicalFragment().get()); | 541 curr_child_margins_, layout_result->PhysicalFragment().get()); |
540 builder_.AddUnpositionedFloat(floating_object); | 542 builder_.AddUnpositionedFloat(floating_object); |
541 // No need to postpone the positioning if we know the correct offset. | 543 // No need to postpone the positioning if we know the correct offset. |
542 if (builder_.BfcOffset()) { | 544 if (builder_.BfcOffset()) { |
543 NGLogicalOffset origin_point = curr_bfc_offset_; | 545 NGLogicalOffset origin_point = curr_bfc_offset_; |
544 // Adjust origin point to the margins of the last child. | 546 // Adjust origin point to the margins of the last child. |
545 // Example: <div style="margin-bottom: 20px"><float></div> | 547 // Example: <div style="margin-bottom: 20px"><float></div> |
546 // <div style="margin-bottom: 30px"></div> | 548 // <div style="margin-bottom: 30px"></div> |
547 origin_point.block_offset += curr_margin_strut_.Sum(); | 549 origin_point.block_offset += curr_margin_strut_.Sum(); |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
744 DCHECK(builder_.BfcOffset()); | 746 DCHECK(builder_.BfcOffset()); |
745 space_available -= curr_bfc_offset_.block_offset; | 747 space_available -= curr_bfc_offset_.block_offset; |
746 } | 748 } |
747 } | 749 } |
748 space_builder_.SetFragmentainerSpaceAvailable(space_available); | 750 space_builder_.SetFragmentainerSpaceAvailable(space_available); |
749 | 751 |
750 return space_builder_.ToConstraintSpace( | 752 return space_builder_.ToConstraintSpace( |
751 FromPlatformWritingMode(child_style.getWritingMode())); | 753 FromPlatformWritingMode(child_style.getWritingMode())); |
752 } | 754 } |
753 } // namespace blink | 755 } // namespace blink |
OLD | NEW |