Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(529)

Unified Diff: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc

Issue 2898413002: [LayoutNG] Add box fragments to line boxes when needed (Closed)
Patch Set: x64 build fix Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index 95c075b7396e9a9f4aa79a142339b6d7aaa77308..f9b7422e2f6b6cb8f80074d41933ab761be24b85 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -222,6 +222,7 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
NGLineHeightMetrics line_metrics_with_leading = line_metrics;
line_metrics_with_leading.AddLeading(line_style.ComputedLineHeightAsFixed());
NGLineBoxFragmentBuilder line_box(Node());
+ line_box.SetWritingMode(ConstraintSpace().WritingMode());
// Compute heights of all inline items by placing the dominant baseline at 0.
// The baseline is adjusted after the height of the line box is computed.
@@ -253,13 +254,26 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
item_result.end_offset);
line_box.AddChild(std::move(text_fragment), {position, box->text_top});
} else if (item.Type() == NGInlineItem::kOpenTag) {
- box = box_states_.OnOpenTag(item, &line_box, &text_builder);
+ box = box_states_.OnOpenTag(item, &line_box);
// Compute text metrics for all inline boxes since even empty inlines
// influence the line height.
// https://drafts.csswg.org/css2/visudet.html#line-height
box->ComputeTextMetrics(*item.Style(), baseline_type_);
+ text_builder.SetDirection(box->style->Direction());
+ // TODO(kojii): We may need more conditions to create box fragments.
+ if (item.Style()->HasBoxDecorationBackground()) {
+ // TODO(kojii): These are once computed in NGLineBreaker. Should copy to
+ // NGInlineItemResult to reuse here.
+ NGBoxStrut borders = ComputeBorders(*constraint_space_, *item.Style());
+ NGBoxStrut paddings = ComputePadding(*constraint_space_, *item.Style());
+ // TODO(kojii): Set paint edges.
+ box->SetNeedsBoxFragment(position,
+ borders.block_start + paddings.block_start,
+ borders.BlockSum() + paddings.BlockSum());
+ }
} else if (item.Type() == NGInlineItem::kCloseTag) {
- box = box_states_.OnCloseTag(item, &line_box, box, baseline_type_);
+ box = box_states_.OnCloseTag(item, &line_box, box, baseline_type_,
+ position);
} else if (item.Type() == NGInlineItem::kAtomicInline) {
box = PlaceAtomicInline(item, &item_result, position, &line_box,
&text_builder);
@@ -286,7 +300,7 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
return true; // The line was empty.
}
- box_states_.OnEndPlaceItems(&line_box, baseline_type_);
+ box_states_.OnEndPlaceItems(&line_box, baseline_type_, position);
// The baselines are always placed at pixel boundaries. Not doing so results
// in incorrect layout of text decorations, most notably underlines.
@@ -342,7 +356,7 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
NGTextFragmentBuilder* text_builder) {
DCHECK(item_result->layout_result);
- NGInlineBoxState* box = box_states_.OnOpenTag(item, line_box, text_builder);
+ NGInlineBoxState* box = box_states_.OnOpenTag(item, line_box);
// For replaced elements, inline-block elements, and inline-table elements,
// the height is the height of their margin box.
@@ -371,6 +385,7 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
// TODO(kojii): Try to eliminate the wrapping text fragment and use the
// |fragment| directly. Currently |CopyFragmentDataToLayoutBlockFlow|
// requires a text fragment.
+ text_builder->SetDirection(item.Style()->Direction());
text_builder->SetSize({fragment.InlineSize(), block_size});
LayoutUnit line_top = item_result->margins.block_start - metrics.ascent;
RefPtr<NGPhysicalTextFragment> text_fragment = text_builder->ToTextFragment(
@@ -378,7 +393,8 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
item_result->end_offset);
line_box->AddChild(std::move(text_fragment), {position, line_top});
- return box_states_.OnCloseTag(item, line_box, box, baseline_type_);
+ return box_states_.OnCloseTag(item, line_box, box, baseline_type_,
+ LayoutUnit(0));
}
void NGInlineLayoutAlgorithm::FindNextLayoutOpportunity() {

Powered by Google App Engine
This is Rietveld 408576698