| 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/inline/ng_inline_layout_algorithm.h" | 5 #include "core/layout/ng/inline/ng_inline_layout_algorithm.h" |
| 6 | 6 |
| 7 #include "core/layout/ng/inline/ng_bidi_paragraph.h" | 7 #include "core/layout/ng/inline/ng_bidi_paragraph.h" |
| 8 #include "core/layout/ng/inline/ng_inline_break_token.h" | 8 #include "core/layout/ng/inline/ng_inline_break_token.h" |
| 9 #include "core/layout/ng/inline/ng_inline_node.h" | 9 #include "core/layout/ng/inline/ng_inline_node.h" |
| 10 #include "core/layout/ng/inline/ng_line_box_fragment.h" | 10 #include "core/layout/ng/inline/ng_line_box_fragment.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 : NGLayoutAlgorithm(inline_node, space, break_token), | 59 : NGLayoutAlgorithm(inline_node, space, break_token), |
| 60 is_horizontal_writing_mode_( | 60 is_horizontal_writing_mode_( |
| 61 blink::IsHorizontalWritingMode(space->WritingMode())), | 61 blink::IsHorizontalWritingMode(space->WritingMode())), |
| 62 disallow_first_line_rules_(false), | 62 disallow_first_line_rules_(false), |
| 63 space_builder_(space) | 63 space_builder_(space) |
| 64 #if DCHECK_IS_ON() | 64 #if DCHECK_IS_ON() |
| 65 , | 65 , |
| 66 is_bidi_reordered_(false) | 66 is_bidi_reordered_(false) |
| 67 #endif | 67 #endif |
| 68 { | 68 { |
| 69 container_builder_.MutableUnpositionedFloats() = space->UnpositionedFloats(); |
| 70 |
| 71 // TODO(crbug.com/716930): We may be an empty LayoutInline due to splitting. |
| 72 // Only resolve our BFC offset if we know that we are non-empty as we may |
| 73 // need to pass through our margin strut. |
| 74 if (!inline_node->Items().IsEmpty()) { |
| 75 NGLogicalOffset bfc_offset = ConstraintSpace().BfcOffset(); |
| 76 bfc_offset.block_offset += ConstraintSpace().MarginStrut().Sum(); |
| 77 MaybeUpdateFragmentBfcOffset(ConstraintSpace(), bfc_offset, |
| 78 &container_builder_); |
| 79 PositionPendingFloats(bfc_offset.block_offset, &container_builder_, |
| 80 MutableConstraintSpace()); |
| 81 } |
| 82 |
| 69 if (!is_horizontal_writing_mode_) | 83 if (!is_horizontal_writing_mode_) |
| 70 baseline_type_ = FontBaseline::kIdeographicBaseline; | 84 baseline_type_ = FontBaseline::kIdeographicBaseline; |
| 71 if (break_token) | 85 if (break_token) |
| 72 Initialize(break_token->ItemIndex(), break_token->TextOffset()); | 86 Initialize(break_token->ItemIndex(), break_token->TextOffset()); |
| 73 else | 87 else |
| 74 Initialize(0, 0); | 88 Initialize(0, 0); |
| 75 container_builder_.MutableUnpositionedFloats() = space->UnpositionedFloats(); | |
| 76 } | 89 } |
| 77 | 90 |
| 78 bool NGInlineLayoutAlgorithm::IsFirstLine() const { | 91 bool NGInlineLayoutAlgorithm::IsFirstLine() const { |
| 79 return !disallow_first_line_rules_ && container_builder_.Children().IsEmpty(); | 92 return !disallow_first_line_rules_ && container_builder_.Children().IsEmpty(); |
| 80 } | 93 } |
| 81 | 94 |
| 82 const ComputedStyle& NGInlineLayoutAlgorithm::FirstLineStyle() const { | 95 const ComputedStyle& NGInlineLayoutAlgorithm::FirstLineStyle() const { |
| 83 return Node()->GetLayoutObject()->FirstLineStyleRef(); | 96 return Node()->GetLayoutObject()->FirstLineStyleRef(); |
| 84 } | 97 } |
| 85 | 98 |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 236 | 249 |
| 237 bool NGInlineLayoutAlgorithm::CreateLine() { | 250 bool NGInlineLayoutAlgorithm::CreateLine() { |
| 238 if (HasItemsAfterLastBreakOpportunity()) | 251 if (HasItemsAfterLastBreakOpportunity()) |
| 239 SetBreakOpportunity(); | 252 SetBreakOpportunity(); |
| 240 return CreateLineUpToLastBreakOpportunity(); | 253 return CreateLineUpToLastBreakOpportunity(); |
| 241 } | 254 } |
| 242 | 255 |
| 243 bool NGInlineLayoutAlgorithm::CreateLineUpToLastBreakOpportunity() { | 256 bool NGInlineLayoutAlgorithm::CreateLineUpToLastBreakOpportunity() { |
| 244 const Vector<NGInlineItem>& items = Node()->Items(); | 257 const Vector<NGInlineItem>& items = Node()->Items(); |
| 245 | 258 |
| 246 // TODO(crbug.com/716930): We may be an empty LayoutInline due to splitting. | |
| 247 // Only resolve our BFC offset if we know that we are non-empty as we may | |
| 248 // need to pass through our margin strut. | |
| 249 if (!items.IsEmpty()) { | |
| 250 NGLogicalOffset bfc_offset = ConstraintSpace().BfcOffset(); | |
| 251 bfc_offset.block_offset += ConstraintSpace().MarginStrut().Sum(); | |
| 252 MaybeUpdateFragmentBfcOffset(ConstraintSpace(), bfc_offset, | |
| 253 &container_builder_); | |
| 254 PositionPendingFloats(bfc_offset.block_offset, &container_builder_, | |
| 255 MutableConstraintSpace()); | |
| 256 } | |
| 257 | |
| 258 // Create a list of LineItemChunk from |start| and |last_break_opportunity|. | 259 // Create a list of LineItemChunk from |start| and |last_break_opportunity|. |
| 259 // TODO(kojii): Consider refactoring LineItemChunk once NGLineBuilder's public | 260 // TODO(kojii): Consider refactoring LineItemChunk once NGLineBuilder's public |
| 260 // API is more finalized. It does not fit well with the current API. | 261 // API is more finalized. It does not fit well with the current API. |
| 261 Vector<LineItemChunk, 32> line_item_chunks; | 262 Vector<LineItemChunk, 32> line_item_chunks; |
| 262 unsigned start_offset = start_offset_; | 263 unsigned start_offset = start_offset_; |
| 263 for (unsigned i = start_index_; i <= last_break_opportunity_index_; i++) { | 264 for (unsigned i = start_index_; i <= last_break_opportunity_index_; i++) { |
| 264 const NGInlineItem& item = items[i]; | 265 const NGInlineItem& item = items[i]; |
| 265 unsigned end_offset = | 266 unsigned end_offset = |
| 266 std::min(item.EndOffset(), last_break_opportunity_offset_); | 267 std::min(item.EndOffset(), last_break_opportunity_offset_); |
| 267 line_item_chunks.push_back( | 268 line_item_chunks.push_back( |
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 state->metrics.Unite(metrics); | 545 state->metrics.Unite(metrics); |
| 545 | 546 |
| 546 // TODO(kojii): Figure out what to do with OOF in NGLayoutResult. | 547 // TODO(kojii): Figure out what to do with OOF in NGLayoutResult. |
| 547 // Floats are ok because atomic inlines are BFC? | 548 // Floats are ok because atomic inlines are BFC? |
| 548 | 549 |
| 549 return -metrics.ascent; | 550 return -metrics.ascent; |
| 550 } | 551 } |
| 551 | 552 |
| 552 void NGInlineLayoutAlgorithm::FindNextLayoutOpportunity() { | 553 void NGInlineLayoutAlgorithm::FindNextLayoutOpportunity() { |
| 553 NGLogicalOffset iter_offset = ConstraintSpace().BfcOffset(); | 554 NGLogicalOffset iter_offset = ConstraintSpace().BfcOffset(); |
| 555 if (container_builder_.BfcOffset()) |
| 556 iter_offset = ContainerBfcOffset(); |
| 554 iter_offset.block_offset += content_size_; | 557 iter_offset.block_offset += content_size_; |
| 555 auto* iter = MutableConstraintSpace()->LayoutOpportunityIterator(iter_offset); | 558 auto* iter = MutableConstraintSpace()->LayoutOpportunityIterator(iter_offset); |
| 556 NGLayoutOpportunity opportunity = iter->Next(); | 559 NGLayoutOpportunity opportunity = iter->Next(); |
| 557 if (!opportunity.IsEmpty()) | 560 if (!opportunity.IsEmpty()) |
| 558 current_opportunity_ = opportunity; | 561 current_opportunity_ = opportunity; |
| 559 } | 562 } |
| 560 | 563 |
| 561 RefPtr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() { | 564 RefPtr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() { |
| 562 // TODO(koji): The relationship of NGInlineLayoutAlgorithm and NGLineBreaker | 565 // TODO(koji): The relationship of NGInlineLayoutAlgorithm and NGLineBreaker |
| 563 // should be inverted. | 566 // should be inverted. |
| (...skipping 30 matching lines...) Expand all Loading... |
| 594 | 597 |
| 595 // max-content is the width without any line wrapping. | 598 // max-content is the width without any line wrapping. |
| 596 // TODO(kojii): Implement hard breaks (<br> etc.) to break. | 599 // TODO(kojii): Implement hard breaks (<br> etc.) to break. |
| 597 for (const auto& item : Node()->Items()) | 600 for (const auto& item : Node()->Items()) |
| 598 sizes.max_content += InlineSize(item); | 601 sizes.max_content += InlineSize(item); |
| 599 | 602 |
| 600 return sizes; | 603 return sizes; |
| 601 } | 604 } |
| 602 | 605 |
| 603 } // namespace blink | 606 } // namespace blink |
| OLD | NEW |