| 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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 item_result.end_offset); | 252 item_result.end_offset); |
| 253 line_box.AddChild(std::move(text_fragment), {position, box->text_top}); | 253 line_box.AddChild(std::move(text_fragment), {position, box->text_top}); |
| 254 } else if (item.Type() == NGInlineItem::kOpenTag) { | 254 } else if (item.Type() == NGInlineItem::kOpenTag) { |
| 255 box = box_states_.OnOpenTag(item, &line_box); | 255 box = box_states_.OnOpenTag(item, &line_box); |
| 256 // Compute text metrics for all inline boxes since even empty inlines | 256 // Compute text metrics for all inline boxes since even empty inlines |
| 257 // influence the line height. | 257 // influence the line height. |
| 258 // https://drafts.csswg.org/css2/visudet.html#line-height | 258 // https://drafts.csswg.org/css2/visudet.html#line-height |
| 259 box->ComputeTextMetrics(*item.Style(), baseline_type_); | 259 box->ComputeTextMetrics(*item.Style(), baseline_type_); |
| 260 text_builder.SetDirection(box->style->Direction()); | 260 text_builder.SetDirection(box->style->Direction()); |
| 261 // TODO(kojii): We may need more conditions to create box fragments. | 261 // TODO(kojii): We may need more conditions to create box fragments. |
| 262 if (item.Style()->HasBoxDecorationBackground()) { | 262 if (item.Style()->HasBoxDecorationBackground()) |
| 263 // TODO(kojii): These are once computed in NGLineBreaker. Should copy to | 263 box->SetNeedsBoxFragment(item, item_result, position); |
| 264 // NGInlineItemResult to reuse here. | |
| 265 NGBoxStrut borders = ComputeBorders(*constraint_space_, *item.Style()); | |
| 266 NGBoxStrut paddings = ComputePadding(*constraint_space_, *item.Style()); | |
| 267 // TODO(kojii): Set paint edges. | |
| 268 box->SetNeedsBoxFragment(position, | |
| 269 borders.block_start + paddings.block_start, | |
| 270 borders.BlockSum() + paddings.BlockSum()); | |
| 271 } | |
| 272 } else if (item.Type() == NGInlineItem::kCloseTag) { | 264 } else if (item.Type() == NGInlineItem::kCloseTag) { |
| 273 position += item_result.inline_size; | 265 position += item_result.inline_size; |
| 274 box = box_states_.OnCloseTag(item, &line_box, box, baseline_type_, | 266 if (box->needs_box_fragment) |
| 275 position); | 267 box->SetLineRightForBoxFragment(item, item_result, position); |
| 268 box = box_states_.OnCloseTag(item, &line_box, box, baseline_type_); |
| 276 continue; | 269 continue; |
| 277 } else if (item.Type() == NGInlineItem::kAtomicInline) { | 270 } else if (item.Type() == NGInlineItem::kAtomicInline) { |
| 278 box = PlaceAtomicInline(item, &item_result, position, &line_box, | 271 box = PlaceAtomicInline(item, &item_result, position, &line_box, |
| 279 &text_builder); | 272 &text_builder); |
| 280 } else if (item.Type() == NGInlineItem::kOutOfFlowPositioned) { | 273 } else if (item.Type() == NGInlineItem::kOutOfFlowPositioned) { |
| 281 // TODO(layout-dev): Report the correct static position for the out of | 274 // TODO(layout-dev): Report the correct static position for the out of |
| 282 // flow descendant. We can't do this here yet as it doesn't know the | 275 // flow descendant. We can't do this here yet as it doesn't know the |
| 283 // size of the line box. | 276 // size of the line box. |
| 284 container_builder_.AddOutOfFlowDescendant( | 277 container_builder_.AddOutOfFlowDescendant( |
| 285 // Absolute positioning blockifies the box's display type. | 278 // Absolute positioning blockifies the box's display type. |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 // |fragment| directly. Currently |CopyFragmentDataToLayoutBlockFlow| | 373 // |fragment| directly. Currently |CopyFragmentDataToLayoutBlockFlow| |
| 381 // requires a text fragment. | 374 // requires a text fragment. |
| 382 text_builder->SetDirection(item.Style()->Direction()); | 375 text_builder->SetDirection(item.Style()->Direction()); |
| 383 text_builder->SetSize({fragment.InlineSize(), block_size}); | 376 text_builder->SetSize({fragment.InlineSize(), block_size}); |
| 384 LayoutUnit line_top = item_result->margins.block_start - metrics.ascent; | 377 LayoutUnit line_top = item_result->margins.block_start - metrics.ascent; |
| 385 RefPtr<NGPhysicalTextFragment> text_fragment = text_builder->ToTextFragment( | 378 RefPtr<NGPhysicalTextFragment> text_fragment = text_builder->ToTextFragment( |
| 386 item_result->item_index, item_result->start_offset, | 379 item_result->item_index, item_result->start_offset, |
| 387 item_result->end_offset); | 380 item_result->end_offset); |
| 388 line_box->AddChild(std::move(text_fragment), {position, line_top}); | 381 line_box->AddChild(std::move(text_fragment), {position, line_top}); |
| 389 | 382 |
| 390 return box_states_.OnCloseTag(item, line_box, box, baseline_type_, | 383 return box_states_.OnCloseTag(item, line_box, box, baseline_type_); |
| 391 LayoutUnit(0)); | |
| 392 } | 384 } |
| 393 | 385 |
| 394 void NGInlineLayoutAlgorithm::ApplyTextAlign(LayoutUnit* line_left, | 386 void NGInlineLayoutAlgorithm::ApplyTextAlign(LayoutUnit* line_left, |
| 395 LayoutUnit inline_size, | 387 LayoutUnit inline_size, |
| 396 LayoutUnit available_width) { | 388 LayoutUnit available_width) { |
| 397 // TODO(kojii): Implement text-align-last. | 389 // TODO(kojii): Implement text-align-last. |
| 398 ETextAlign text_align = LineStyle().GetTextAlign(); | 390 ETextAlign text_align = LineStyle().GetTextAlign(); |
| 399 switch (text_align) { | 391 switch (text_align) { |
| 400 case ETextAlign::kRight: | 392 case ETextAlign::kRight: |
| 401 case ETextAlign::kWebkitRight: | 393 case ETextAlign::kWebkitRight: |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 455 // Margin struts shouldn't need to be passed through like this once we've | 447 // Margin struts shouldn't need to be passed through like this once we've |
| 456 // removed LayoutInline splitting. | 448 // removed LayoutInline splitting. |
| 457 if (!container_builder_.BfcOffset()) { | 449 if (!container_builder_.BfcOffset()) { |
| 458 container_builder_.SetEndMarginStrut(ConstraintSpace().MarginStrut()); | 450 container_builder_.SetEndMarginStrut(ConstraintSpace().MarginStrut()); |
| 459 } | 451 } |
| 460 | 452 |
| 461 return container_builder_.ToBoxFragment(); | 453 return container_builder_.ToBoxFragment(); |
| 462 } | 454 } |
| 463 | 455 |
| 464 } // namespace blink | 456 } // namespace blink |
| OLD | NEW |