| 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_constraint_space.h" | 7 #include "core/layout/ng/ng_constraint_space.h" |
| 8 #include "core/layout/ng/ng_constraint_space_builder.h" | 8 #include "core/layout/ng/ng_constraint_space_builder.h" |
| 9 #include "core/layout/ng/ng_fragment_builder.h" | 9 #include "core/layout/ng/ng_fragment_builder.h" |
| 10 #include "core/layout/ng/ng_fragment.h" | 10 #include "core/layout/ng/ng_fragment.h" |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 const NGMarginStrut& prev_margin_strut, | 21 const NGMarginStrut& prev_margin_strut, |
| 22 const NGMarginStrut& curr_margin_strut) { | 22 const NGMarginStrut& curr_margin_strut) { |
| 23 return std::max(prev_margin_strut.margin_block_end, | 23 return std::max(prev_margin_strut.margin_block_end, |
| 24 curr_margin_strut.margin_block_start) - | 24 curr_margin_strut.margin_block_start) - |
| 25 std::max(prev_margin_strut.negative_margin_block_end.abs(), | 25 std::max(prev_margin_strut.negative_margin_block_end.abs(), |
| 26 curr_margin_strut.negative_margin_block_start.abs()); | 26 curr_margin_strut.negative_margin_block_start.abs()); |
| 27 } | 27 } |
| 28 | 28 |
| 29 // Creates an exclusion from the fragment that will be placed in the provided | 29 // Creates an exclusion from the fragment that will be placed in the provided |
| 30 // layout opportunity. | 30 // layout opportunity. |
| 31 NGLogicalRect CreateExclusion(const NGFragment& fragment, | 31 NGExclusion* CreateExclusion(const NGFragment& fragment, |
| 32 const NGLayoutOpportunity& opportunity, | 32 const NGLayoutOpportunity& opportunity, |
| 33 LayoutUnit float_offset, | 33 LayoutUnit float_offset, |
| 34 NGBoxStrut margins) { | 34 NGBoxStrut margins) { |
| 35 NGLogicalRect exclusion; | 35 LayoutUnit exclusion_top = opportunity.offset.block_offset; |
| 36 exclusion.offset = opportunity.offset; | |
| 37 exclusion.offset.inline_offset += float_offset; | |
| 38 | 36 |
| 39 exclusion.size.inline_size = fragment.InlineSize(); | 37 LayoutUnit exclusion_left = opportunity.offset.inline_offset; |
| 40 exclusion.size.block_size = fragment.BlockSize(); | 38 exclusion_left += float_offset; |
| 39 |
| 40 LayoutUnit exclusion_bottom = exclusion_top + fragment.BlockSize(); |
| 41 LayoutUnit exclusion_right = exclusion_left + fragment.InlineSize(); |
| 41 | 42 |
| 42 // Adjust to child's margin. | 43 // Adjust to child's margin. |
| 43 exclusion.size.block_size += margins.BlockSum(); | 44 exclusion_bottom += margins.BlockSum(); |
| 44 exclusion.size.inline_size += margins.InlineSum(); | 45 exclusion_right += margins.InlineSum(); |
| 45 | 46 |
| 46 return exclusion; | 47 return new NGExclusion(exclusion_top, exclusion_right, exclusion_bottom, |
| 48 exclusion_left); |
| 47 } | 49 } |
| 48 | 50 |
| 49 // Finds a layout opportunity for the fragment. | 51 // Finds a layout opportunity for the fragment. |
| 50 // It iterates over all layout opportunities in the constraint space and returns | 52 // It iterates over all layout opportunities in the constraint space and returns |
| 51 // the first layout opportunity that is wider than the fragment or returns the | 53 // the first layout opportunity that is wider than the fragment or returns the |
| 52 // last one which is always the widest. | 54 // last one which is always the widest. |
| 53 // | 55 // |
| 54 // @param space Constraint space that is used to find layout opportunity for | 56 // @param space Constraint space that is used to find layout opportunity for |
| 55 // the fragment. | 57 // the fragment. |
| 56 // @param fragment Fragment that needs to be placed. | 58 // @param fragment Fragment that needs to be placed. |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 FindLayoutOpportunityForFragment(constraint_space_, fragment, margins); | 354 FindLayoutOpportunityForFragment(constraint_space_, fragment, margins); |
| 353 DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be"; | 355 DCHECK(!opportunity.IsEmpty()) << "Opportunity is empty but it shouldn't be"; |
| 354 | 356 |
| 355 // Calculate the float offset if needed. | 357 // Calculate the float offset if needed. |
| 356 LayoutUnit float_offset; | 358 LayoutUnit float_offset; |
| 357 if (current_child_->Style()->floating() == EFloat::Right) { | 359 if (current_child_->Style()->floating() == EFloat::Right) { |
| 358 float_offset = opportunity.size.inline_size - fragment.InlineSize(); | 360 float_offset = opportunity.size.inline_size - fragment.InlineSize(); |
| 359 } | 361 } |
| 360 | 362 |
| 361 // Add the float as an exclusion. | 363 // Add the float as an exclusion. |
| 362 const NGLogicalRect exclusion = | 364 const NGExclusion* exclusion = |
| 363 CreateExclusion(fragment, opportunity, float_offset, margins); | 365 CreateExclusion(fragment, opportunity, float_offset, margins); |
| 364 constraint_space_->AddExclusion(exclusion); | 366 constraint_space_->AddExclusion(exclusion); |
| 365 | 367 |
| 366 return CalculateLogicalOffsetForOpportunity(opportunity, border_and_padding_, | 368 return CalculateLogicalOffsetForOpportunity(opportunity, border_and_padding_, |
| 367 float_offset, margins); | 369 float_offset, margins); |
| 368 } | 370 } |
| 369 | 371 |
| 370 void NGBlockLayoutAlgorithm::UpdateMarginStrut(const NGMarginStrut& from) { | 372 void NGBlockLayoutAlgorithm::UpdateMarginStrut(const NGMarginStrut& from) { |
| 371 if (!is_fragment_margin_strut_block_start_updated_) { | 373 if (!is_fragment_margin_strut_block_start_updated_) { |
| 372 builder_->SetMarginStrutBlockStart(from); | 374 builder_->SetMarginStrutBlockStart(from); |
| 373 is_fragment_margin_strut_block_start_updated_ = true; | 375 is_fragment_margin_strut_block_start_updated_ = true; |
| 374 } | 376 } |
| 375 builder_->SetMarginStrutBlockEnd(from); | 377 builder_->SetMarginStrutBlockEnd(from); |
| 376 } | 378 } |
| 377 | 379 |
| 378 DEFINE_TRACE(NGBlockLayoutAlgorithm) { | 380 DEFINE_TRACE(NGBlockLayoutAlgorithm) { |
| 379 NGLayoutAlgorithm::trace(visitor); | 381 NGLayoutAlgorithm::trace(visitor); |
| 380 visitor->trace(first_child_); | 382 visitor->trace(first_child_); |
| 381 visitor->trace(constraint_space_); | 383 visitor->trace(constraint_space_); |
| 382 visitor->trace(builder_); | 384 visitor->trace(builder_); |
| 383 visitor->trace(space_builder_); | 385 visitor->trace(space_builder_); |
| 384 visitor->trace(space_for_current_child_); | 386 visitor->trace(space_for_current_child_); |
| 385 visitor->trace(current_child_); | 387 visitor->trace(current_child_); |
| 386 } | 388 } |
| 387 | 389 |
| 388 } // namespace blink | 390 } // namespace blink |
| OLD | NEW |