| 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_break_token.h" | 7 #include "core/layout/ng/ng_break_token.h" |
| 8 #include "core/layout/ng/ng_constraint_space.h" | 8 #include "core/layout/ng/ng_constraint_space.h" |
| 9 #include "core/layout/ng/ng_constraint_space_builder.h" | 9 #include "core/layout/ng/ng_constraint_space_builder.h" |
| 10 #include "core/layout/ng/ng_fragment_base.h" | 10 #include "core/layout/ng/ng_fragment_base.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 | 22 |
| 23 // Adjusts content's offset to CSS "clear" property. | 23 // Adjusts content's offset to CSS "clear" property. |
| 24 // TODO(glebl): Support margin collapsing edge cases, e.g. margin collapsing | 24 // TODO(glebl): Support margin collapsing edge cases, e.g. margin collapsing |
| 25 // should not occur if "clear" is applied to non-floating blocks. | 25 // should not occur if "clear" is applied to non-floating blocks. |
| 26 // TODO(layout-ng): the call to AdjustToClearance should be moved to | 26 // TODO(layout-ng): the call to AdjustToClearance should be moved to |
| 27 // CreateConstraintSpaceForChild once ConstraintSpaceBuilder is sharing the | 27 // CreateConstraintSpaceForChild once ConstraintSpaceBuilder is sharing the |
| 28 // exclusion information between constraint spaces. | 28 // exclusion information between constraint spaces. |
| 29 void AdjustToClearance(const NGConstraintSpace& space, | 29 void AdjustToClearance(const NGConstraintSpace& space, |
| 30 const ComputedStyle& style, | 30 const ComputedStyle& style, |
| 31 LayoutUnit* content_size) { | 31 LayoutUnit* content_size) { |
| 32 const NGExclusion* right_exclusion = space.LastRightFloatExclusion(); | 32 const NGExclusion* right_exclusion = space.Exclusions()->last_right_float; |
| 33 const NGExclusion* left_exclusion = space.LastLeftFloatExclusion(); | 33 const NGExclusion* left_exclusion = space.Exclusions()->last_left_float; |
| 34 | 34 |
| 35 // Calculates Left/Right block end offset from left/right float exclusions or | 35 // Calculates Left/Right block end offset from left/right float exclusions or |
| 36 // use the default content offset position. | 36 // use the default content offset position. |
| 37 LayoutUnit left_block_end_offset = | 37 LayoutUnit left_block_end_offset = |
| 38 left_exclusion ? left_exclusion->rect.BlockEndOffset() : *content_size; | 38 left_exclusion ? left_exclusion->rect.BlockEndOffset() : *content_size; |
| 39 LayoutUnit right_block_end_offset = | 39 LayoutUnit right_block_end_offset = |
| 40 right_exclusion ? right_exclusion->rect.BlockEndOffset() : *content_size; | 40 right_exclusion ? right_exclusion->rect.BlockEndOffset() : *content_size; |
| 41 | 41 |
| 42 switch (style.clear()) { | 42 switch (style.clear()) { |
| 43 case EClear::ClearNone: | 43 case EClear::ClearNone: |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 // -1? | 211 // -1? |
| 212 LayoutUnit block_size = ComputeBlockSizeForFragment( | 212 LayoutUnit block_size = ComputeBlockSizeForFragment( |
| 213 ConstraintSpace(), Style(), NGSizeIndefinite); | 213 ConstraintSpace(), Style(), NGSizeIndefinite); |
| 214 LayoutUnit adjusted_block_size(block_size); | 214 LayoutUnit adjusted_block_size(block_size); |
| 215 // Our calculated block-axis size may be indefinite at this point. | 215 // Our calculated block-axis size may be indefinite at this point. |
| 216 // If so, just leave the size as NGSizeIndefinite instead of subtracting | 216 // If so, just leave the size as NGSizeIndefinite instead of subtracting |
| 217 // borders and padding. | 217 // borders and padding. |
| 218 if (adjusted_block_size != NGSizeIndefinite) | 218 if (adjusted_block_size != NGSizeIndefinite) |
| 219 adjusted_block_size -= border_and_padding_.BlockSum(); | 219 adjusted_block_size -= border_and_padding_.BlockSum(); |
| 220 | 220 |
| 221 space_builder_ = | 221 space_builder_ = new NGConstraintSpaceBuilder(constraint_space_); |
| 222 new NGConstraintSpaceBuilder(constraint_space_->WritingMode()); | |
| 223 if (Style().specifiesColumns()) { | 222 if (Style().specifiesColumns()) { |
| 224 space_builder_->SetFragmentationType(kFragmentColumn); | 223 space_builder_->SetFragmentationType(kFragmentColumn); |
| 225 adjusted_inline_size = | 224 adjusted_inline_size = |
| 226 ResolveUsedColumnInlineSize(adjusted_inline_size, Style()); | 225 ResolveUsedColumnInlineSize(adjusted_inline_size, Style()); |
| 227 } | 226 } |
| 228 space_builder_->SetAvailableSize( | 227 space_builder_->SetAvailableSize( |
| 229 NGLogicalSize(adjusted_inline_size, adjusted_block_size)); | 228 NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
| 230 space_builder_->SetPercentageResolutionSize( | 229 space_builder_->SetPercentageResolutionSize( |
| 231 NGLogicalSize(adjusted_inline_size, adjusted_block_size)); | 230 NGLogicalSize(adjusted_inline_size, adjusted_block_size)); |
| 232 | 231 |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 422 } | 421 } |
| 423 builder_->SetMarginStrutBlockEnd(from); | 422 builder_->SetMarginStrutBlockEnd(from); |
| 424 } | 423 } |
| 425 | 424 |
| 426 NGConstraintSpace* | 425 NGConstraintSpace* |
| 427 NGBlockLayoutAlgorithm::CreateConstraintSpaceForCurrentChild() const { | 426 NGBlockLayoutAlgorithm::CreateConstraintSpaceForCurrentChild() const { |
| 428 DCHECK(current_child_); | 427 DCHECK(current_child_); |
| 429 space_builder_->SetIsNewFormattingContext( | 428 space_builder_->SetIsNewFormattingContext( |
| 430 IsNewFormattingContextForInFlowBlockLevelChild(ConstraintSpace(), | 429 IsNewFormattingContextForInFlowBlockLevelChild(ConstraintSpace(), |
| 431 CurrentChildStyle())); | 430 CurrentChildStyle())); |
| 432 NGConstraintSpace* child_space = new NGConstraintSpace( | 431 NGConstraintSpace* child_space = space_builder_->ToConstraintSpace(); |
| 433 constraint_space_->WritingMode(), constraint_space_->Direction(), | |
| 434 space_builder_->ToConstraintSpace()); | |
| 435 | 432 |
| 436 // TODO(layout-ng): Set offset through the space builder. | 433 // TODO(layout-ng): Set offset through the space builder. |
| 437 child_space->SetOffset( | 434 child_space->SetOffset( |
| 438 NGLogicalOffset(border_and_padding_.inline_start, content_size_)); | 435 NGLogicalOffset(border_and_padding_.inline_start, content_size_)); |
| 439 | |
| 440 // TODO(layout-ng): avoid copying here. A child and parent constraint spaces | |
| 441 // should share the same backing space. | |
| 442 for (const auto& exclusion : constraint_space_->Exclusions()) { | |
| 443 child_space->AddExclusion(*exclusion.get()); | |
| 444 } | |
| 445 return child_space; | 436 return child_space; |
| 446 } | 437 } |
| 447 | 438 |
| 448 DEFINE_TRACE(NGBlockLayoutAlgorithm) { | 439 DEFINE_TRACE(NGBlockLayoutAlgorithm) { |
| 449 NGLayoutAlgorithm::trace(visitor); | 440 NGLayoutAlgorithm::trace(visitor); |
| 450 visitor->trace(first_child_); | 441 visitor->trace(first_child_); |
| 451 visitor->trace(constraint_space_); | 442 visitor->trace(constraint_space_); |
| 452 visitor->trace(break_token_); | 443 visitor->trace(break_token_); |
| 453 visitor->trace(builder_); | 444 visitor->trace(builder_); |
| 454 visitor->trace(space_builder_); | 445 visitor->trace(space_builder_); |
| 455 visitor->trace(space_for_current_child_); | 446 visitor->trace(space_for_current_child_); |
| 456 visitor->trace(current_child_); | 447 visitor->trace(current_child_); |
| 457 } | 448 } |
| 458 | 449 |
| 459 } // namespace blink | 450 } // namespace blink |
| OLD | NEW |