| 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_inline_layout_algorithm.h" | 5 #include "core/layout/ng/ng_inline_layout_algorithm.h" |
| 6 | 6 |
| 7 #include "core/layout/BidiRun.h" | 7 #include "core/layout/BidiRun.h" |
| 8 #include "core/layout/LayoutBlockFlow.h" | 8 #include "core/layout/LayoutBlockFlow.h" |
| 9 #include "core/layout/line/LineInfo.h" | 9 #include "core/layout/line/LineInfo.h" |
| 10 #include "core/layout/line/RootInlineBox.h" | 10 #include "core/layout/line/RootInlineBox.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 .SetIsShrinkToFit(ShouldShrinkToFit(parent_style, style)) | 46 .SetIsShrinkToFit(ShouldShrinkToFit(parent_style, style)) |
| 47 .ToConstraintSpace(FromPlatformWritingMode(style.getWritingMode())); | 47 .ToConstraintSpace(FromPlatformWritingMode(style.getWritingMode())); |
| 48 } | 48 } |
| 49 | 49 |
| 50 NGLogicalOffset GetOriginPointForFloats(const NGConstraintSpace& space, | 50 NGLogicalOffset GetOriginPointForFloats(const NGConstraintSpace& space, |
| 51 LayoutUnit content_size) { | 51 LayoutUnit content_size) { |
| 52 NGLogicalOffset origin_point = space.BfcOffset(); | 52 NGLogicalOffset origin_point = space.BfcOffset(); |
| 53 origin_point.block_offset += content_size; | 53 origin_point.block_offset += content_size; |
| 54 return origin_point; | 54 return origin_point; |
| 55 } | 55 } |
| 56 | |
| 57 void PositionPendingFloats(const NGLogicalOffset& origin_point, | |
| 58 NGConstraintSpace* space, | |
| 59 NGFragmentBuilder* builder) { | |
| 60 DCHECK(builder) << "Builder cannot be null here"; | |
| 61 | |
| 62 for (auto& floating_object : builder->UnpositionedFloats()) { | |
| 63 NGLogicalOffset offset = PositionFloat(origin_point, space->BfcOffset(), | |
| 64 floating_object.get(), space); | |
| 65 builder->AddFloatingObject(floating_object, offset); | |
| 66 } | |
| 67 builder->MutableUnpositionedFloats().clear(); | |
| 68 } | |
| 69 | |
| 70 } // namespace | 56 } // namespace |
| 71 | 57 |
| 72 NGInlineLayoutAlgorithm::NGInlineLayoutAlgorithm( | 58 NGInlineLayoutAlgorithm::NGInlineLayoutAlgorithm( |
| 73 NGInlineNode* inline_node, | 59 NGInlineNode* inline_node, |
| 74 NGConstraintSpace* space, | 60 NGConstraintSpace* space, |
| 75 NGInlineBreakToken* break_token) | 61 NGInlineBreakToken* break_token) |
| 76 : NGLayoutAlgorithm(inline_node, space, break_token), | 62 : NGLayoutAlgorithm(inline_node, space, break_token), |
| 77 container_builder_(NGPhysicalFragment::kFragmentBox, inline_node), | 63 container_builder_(NGPhysicalFragment::kFragmentBox, inline_node), |
| 78 is_horizontal_writing_mode_( | 64 is_horizontal_writing_mode_( |
| 79 blink::IsHorizontalWritingMode(space->WritingMode())), | 65 blink::IsHorizontalWritingMode(space->WritingMode())), |
| 80 space_builder_(space) | 66 space_builder_(space) |
| 81 #if DCHECK_IS_ON() | 67 #if DCHECK_IS_ON() |
| 82 , | 68 , |
| 83 is_bidi_reordered_(false) | 69 is_bidi_reordered_(false) |
| 84 #endif | 70 #endif |
| 85 { | 71 { |
| 86 if (!is_horizontal_writing_mode_) | 72 if (!is_horizontal_writing_mode_) |
| 87 baseline_type_ = FontBaseline::IdeographicBaseline; | 73 baseline_type_ = FontBaseline::IdeographicBaseline; |
| 88 if (break_token) | 74 if (break_token) |
| 89 Initialize(break_token->ItemIndex(), break_token->TextOffset()); | 75 Initialize(break_token->ItemIndex(), break_token->TextOffset()); |
| 90 else | 76 else |
| 91 Initialize(0, 0); | 77 Initialize(0, 0); |
| 78 |
| 79 // BFC offset is known for inline fragments. |
| 80 container_builder_.SetBfcOffset(space->BfcOffset()); |
| 92 } | 81 } |
| 93 | 82 |
| 94 bool NGInlineLayoutAlgorithm::CanFitOnLine() const { | 83 bool NGInlineLayoutAlgorithm::CanFitOnLine() const { |
| 95 LayoutUnit available_size = current_opportunity_.InlineSize(); | 84 LayoutUnit available_size = current_opportunity_.InlineSize(); |
| 96 if (available_size == NGSizeIndefinite) | 85 if (available_size == NGSizeIndefinite) |
| 97 return true; | 86 return true; |
| 98 return end_position_ <= available_size; | 87 return end_position_ <= available_size; |
| 99 } | 88 } |
| 100 | 89 |
| 101 bool NGInlineLayoutAlgorithm::HasItems() const { | 90 bool NGInlineLayoutAlgorithm::HasItems() const { |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 start_offset_ = last_break_opportunity_offset_; | 261 start_offset_ = last_break_opportunity_offset_; |
| 273 DCHECK_GE(end_position_, last_break_opportunity_position_); | 262 DCHECK_GE(end_position_, last_break_opportunity_position_); |
| 274 end_position_ -= last_break_opportunity_position_; | 263 end_position_ -= last_break_opportunity_position_; |
| 275 last_break_opportunity_position_ = LayoutUnit(); | 264 last_break_opportunity_position_ = LayoutUnit(); |
| 276 #if DCHECK_IS_ON() | 265 #if DCHECK_IS_ON() |
| 277 is_bidi_reordered_ = false; | 266 is_bidi_reordered_ = false; |
| 278 #endif | 267 #endif |
| 279 | 268 |
| 280 NGLogicalOffset origin_point = | 269 NGLogicalOffset origin_point = |
| 281 GetOriginPointForFloats(ConstraintSpace(), content_size_); | 270 GetOriginPointForFloats(ConstraintSpace(), content_size_); |
| 282 PositionPendingFloats(origin_point, MutableConstraintSpace(), | 271 PositionPendingFloats(origin_point.block_offset, MutableConstraintSpace(), |
| 283 &container_builder_); | 272 &container_builder_); |
| 284 FindNextLayoutOpportunity(); | 273 FindNextLayoutOpportunity(); |
| 285 return true; | 274 return true; |
| 286 } | 275 } |
| 287 | 276 |
| 288 void NGInlineLayoutAlgorithm::BidiReorder( | 277 void NGInlineLayoutAlgorithm::BidiReorder( |
| 289 Vector<LineItemChunk, 32>* line_item_chunks) { | 278 Vector<LineItemChunk, 32>* line_item_chunks) { |
| 290 #if DCHECK_IS_ON() | 279 #if DCHECK_IS_ON() |
| 291 DCHECK(!is_bidi_reordered_); | 280 DCHECK(!is_bidi_reordered_); |
| 292 is_bidi_reordered_ = true; | 281 is_bidi_reordered_ = true; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 // same writing mode - get the inline size ComputeInlineSizeForFragment to | 321 // same writing mode - get the inline size ComputeInlineSizeForFragment to |
| 333 // determine if it fits on this line, then perform layout with the correct | 322 // determine if it fits on this line, then perform layout with the correct |
| 334 // fragmentation line. | 323 // fragmentation line. |
| 335 // diff writing mode - get the inline size from performing layout. | 324 // diff writing mode - get the inline size from performing layout. |
| 336 RefPtr<NGLayoutResult> layout_result = node->Layout(float_space.get()); | 325 RefPtr<NGLayoutResult> layout_result = node->Layout(float_space.get()); |
| 337 | 326 |
| 338 NGBoxFragment float_fragment( | 327 NGBoxFragment float_fragment( |
| 339 float_space->WritingMode(), | 328 float_space->WritingMode(), |
| 340 toNGPhysicalBoxFragment(layout_result->PhysicalFragment().get())); | 329 toNGPhysicalBoxFragment(layout_result->PhysicalFragment().get())); |
| 341 | 330 |
| 331 NGLogicalOffset origin_offset = |
| 332 GetOriginPointForFloats(ConstraintSpace(), content_size_); |
| 333 NGLogicalOffset from_offset = ConstraintSpace().BfcOffset(); |
| 334 // TODO(glebl): add margins calculation. |
| 335 NGBoxStrut margins; |
| 342 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create( | 336 RefPtr<NGFloatingObject> floating_object = NGFloatingObject::Create( |
| 343 float_space.get(), MutableConstraintSpace(), node->Style(), NGBoxStrut(), | 337 node->Style(), float_space->WritingMode(), current_opportunity_.size, |
| 344 current_opportunity_.size, layout_result->PhysicalFragment().get()); | 338 origin_offset, from_offset, margins, |
| 339 layout_result->PhysicalFragment().get()); |
| 345 | 340 |
| 346 bool float_does_not_fit = end_position + float_fragment.InlineSize() > | 341 bool float_does_not_fit = end_position + float_fragment.InlineSize() > |
| 347 current_opportunity_.InlineSize(); | 342 current_opportunity_.InlineSize(); |
| 348 // Check if we already have a pending float. That's because a float cannot be | 343 // Check if we already have a pending float. That's because a float cannot be |
| 349 // higher than any block or floated box generated before. | 344 // higher than any block or floated box generated before. |
| 350 if (!container_builder_.UnpositionedFloats().isEmpty() || | 345 if (!container_builder_.UnpositionedFloats().isEmpty() || |
| 351 float_does_not_fit) { | 346 float_does_not_fit) { |
| 352 container_builder_.AddUnpositionedFloat(floating_object); | 347 container_builder_.AddUnpositionedFloat(floating_object); |
| 353 } else { | 348 } else { |
| 354 NGLogicalOffset origin_point = | |
| 355 GetOriginPointForFloats(ConstraintSpace(), content_size_); | |
| 356 NGLogicalOffset offset = | 349 NGLogicalOffset offset = |
| 357 PositionFloat(origin_point, ConstraintSpace().BfcOffset(), | 350 PositionFloat(floating_object.get(), MutableConstraintSpace()); |
| 358 floating_object.get(), MutableConstraintSpace()); | |
| 359 container_builder_.AddFloatingObject(floating_object, offset); | 351 container_builder_.AddFloatingObject(floating_object, offset); |
| 360 FindNextLayoutOpportunity(); | 352 FindNextLayoutOpportunity(); |
| 361 } | 353 } |
| 362 } | 354 } |
| 363 | 355 |
| 364 bool NGInlineLayoutAlgorithm::PlaceItems( | 356 bool NGInlineLayoutAlgorithm::PlaceItems( |
| 365 const Vector<LineItemChunk, 32>& line_item_chunks) { | 357 const Vector<LineItemChunk, 32>& line_item_chunks) { |
| 366 const Vector<NGLayoutInlineItem>& items = Node()->Items(); | 358 const Vector<NGLayoutInlineItem>& items = Node()->Items(); |
| 367 | 359 |
| 368 NGLineBoxFragmentBuilder line_box(Node()); | 360 NGLineBoxFragmentBuilder line_box(Node()); |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 LayoutUnit baseline = line_top_with_leading + metrics.ascent_and_leading; | 635 LayoutUnit baseline = line_top_with_leading + metrics.ascent_and_leading; |
| 644 root_line_box->setLineTopBottomPositions( | 636 root_line_box->setLineTopBottomPositions( |
| 645 baseline - metrics.ascent, baseline + metrics.descent, | 637 baseline - metrics.ascent, baseline + metrics.descent, |
| 646 line_top_with_leading, baseline + metrics.descent_and_leading); | 638 line_top_with_leading, baseline + metrics.descent_and_leading); |
| 647 | 639 |
| 648 bidi_runs.deleteRuns(); | 640 bidi_runs.deleteRuns(); |
| 649 fragments_for_bidi_runs.clear(); | 641 fragments_for_bidi_runs.clear(); |
| 650 } | 642 } |
| 651 } | 643 } |
| 652 } // namespace blink | 644 } // namespace blink |
| OLD | NEW |