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

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

Issue 2931563002: [LayoutNG] Implement 'text-align-last' (Closed)
Patch Set: Rebase Created 3 years, 6 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 fa0e6e112703b53cd78cc43e7e8ef547690e688a..a5c74dc5d7a7a1b68dd09789698494c5a17ad396 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
@@ -46,7 +46,6 @@ NGInlineLayoutAlgorithm::NGInlineLayoutAlgorithm(
: NGLayoutAlgorithm(inline_node, space, break_token),
is_horizontal_writing_mode_(
blink::IsHorizontalWritingMode(space->WritingMode())),
- disallow_first_line_rules_(false),
space_builder_(space) {
container_builder_.MutableUnpositionedFloats() = space->UnpositionedFloats();
@@ -68,33 +67,9 @@ NGInlineLayoutAlgorithm::NGInlineLayoutAlgorithm(
border_and_padding_ = ComputeBorders(ConstraintSpace(), Style()) +
ComputePadding(ConstraintSpace(), Style());
- if (break_token) {
- // If a break_token is given, we're re-starting layout for 2nd or later
- // lines, and that the first line we create should not use the first line
- // rules.
- DCHECK(!break_token->IsFinished());
- DCHECK(break_token->TextOffset() || break_token->ItemIndex());
- disallow_first_line_rules_ = true;
- } else {
- auto& engine = Node().GetLayoutObject()->GetDocument().GetStyleEngine();
- disallow_first_line_rules_ = !engine.UsesFirstLineRules();
- }
-
FindNextLayoutOpportunity();
}
-bool NGInlineLayoutAlgorithm::IsFirstLine() const {
- return !disallow_first_line_rules_ && container_builder_.Children().IsEmpty();
-}
-
-const ComputedStyle& NGInlineLayoutAlgorithm::FirstLineStyle() const {
- return Node().GetLayoutObject()->FirstLineStyleRef();
-}
-
-const ComputedStyle& NGInlineLayoutAlgorithm::LineStyle() const {
- return IsFirstLine() ? FirstLineStyle() : Style();
-}
-
LayoutUnit NGInlineLayoutAlgorithm::AvailableWidth() const {
return current_opportunity_.InlineSize();
}
@@ -109,12 +84,12 @@ LayoutUnit NGInlineLayoutAlgorithm::LogicalLeftOffset() const {
}
bool NGInlineLayoutAlgorithm::CreateLine(
- NGInlineItemResults* item_results,
+ NGLineInfo* line_info,
RefPtr<NGInlineBreakToken> break_token) {
if (Node().IsBidiEnabled())
- BidiReorder(item_results);
+ BidiReorder(&line_info->Results());
- if (!PlaceItems(item_results, break_token))
+ if (!PlaceItems(line_info, break_token))
return false;
// Prepare for the next line.
@@ -212,11 +187,12 @@ void NGInlineLayoutAlgorithm::LayoutAndPositionFloat(
}
bool NGInlineLayoutAlgorithm::PlaceItems(
- NGInlineItemResults* line_items,
+ NGLineInfo* line_info,
RefPtr<NGInlineBreakToken> break_token) {
+ NGInlineItemResults* line_items = &line_info->Results();
const Vector<NGInlineItem>& items = Node().Items();
- const ComputedStyle& line_style = LineStyle();
+ const ComputedStyle& line_style = line_info->LineStyle();
NGLineHeightMetrics line_metrics(line_style, baseline_type_);
NGLineHeightMetrics line_metrics_with_leading = line_metrics;
line_metrics_with_leading.AddLeading(line_style.ComputedLineHeightAsFixed());
@@ -227,7 +203,7 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
// The baseline is adjusted after the height of the line box is computed.
NGTextFragmentBuilder text_builder(Node());
NGInlineBoxState* box =
- box_states_.OnBeginPlaceItems(&LineStyle(), baseline_type_);
+ box_states_.OnBeginPlaceItems(&line_style, baseline_type_);
// Place items from line-left to line-right along with the baseline.
// Items are already bidi-reordered to the visual order.
@@ -268,8 +244,8 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
box = box_states_.OnCloseTag(item, &line_box, box, baseline_type_);
continue;
} else if (item.Type() == NGInlineItem::kAtomicInline) {
- box = PlaceAtomicInline(item, &item_result, position, &line_box,
- &text_builder);
+ box = PlaceAtomicInline(item, &item_result, line_info->IsFirstLine(),
+ position, &line_box, &text_builder);
} else if (item.Type() == NGInlineItem::kOutOfFlowPositioned) {
// TODO(layout-dev): Report the correct static position for the out of
// flow descendant. We can't do this here yet as it doesn't know the
@@ -322,7 +298,8 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
LayoutUnit inline_size = position;
NGLogicalOffset offset(LogicalLeftOffset(),
baseline - box_states_.LineBoxState().metrics.ascent);
- ApplyTextAlign(&offset.inline_offset, inline_size,
+ ApplyTextAlign(line_style, line_style.GetTextAlign(line_info->IsLastLine()),
+ &offset.inline_offset, inline_size,
current_opportunity_.size.inline_size);
line_box.SetInlineSize(inline_size);
@@ -338,6 +315,7 @@ bool NGInlineLayoutAlgorithm::PlaceItems(
NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
const NGInlineItem& item,
NGInlineItemResult* item_result,
+ bool is_first_line,
LayoutUnit position,
NGLineBoxFragmentBuilder* line_box,
NGTextFragmentBuilder* text_builder) {
@@ -361,7 +339,7 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
IsHorizontalWritingMode() ? LineDirectionMode::kHorizontalLine
: LineDirectionMode::kVerticalLine;
LayoutUnit baseline_offset(layout_box->BaselinePosition(
- baseline_type_, IsFirstLine(), line_direction_mode));
+ baseline_type_, is_first_line, line_direction_mode));
NGLineHeightMetrics metrics(baseline_offset, block_size - baseline_offset);
box->metrics.Unite(metrics);
@@ -383,11 +361,11 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
return box_states_.OnCloseTag(item, line_box, box, baseline_type_);
}
-void NGInlineLayoutAlgorithm::ApplyTextAlign(LayoutUnit* line_left,
+void NGInlineLayoutAlgorithm::ApplyTextAlign(const ComputedStyle& line_style,
+ ETextAlign text_align,
+ LayoutUnit* line_left,
LayoutUnit inline_size,
LayoutUnit available_width) {
- // TODO(kojii): Implement text-align-last.
- ETextAlign text_align = LineStyle().GetTextAlign();
switch (text_align) {
case ETextAlign::kRight:
case ETextAlign::kWebkitRight:
@@ -395,8 +373,7 @@ void NGInlineLayoutAlgorithm::ApplyTextAlign(LayoutUnit* line_left,
// So even if text-align is right, if direction is LTR, wide lines should
// overflow out of the right side of the block.
// TODO(kojii): Investigate how to handle trailing spaces.
- if (inline_size < available_width ||
- !LineStyle().IsLeftToRightDirection())
+ if (inline_size < available_width || !line_style.IsLeftToRightDirection())
*line_left += available_width - inline_size;
break;
default:
@@ -426,14 +403,9 @@ RefPtr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() {
content_size_ = BreakToken() ? LayoutUnit() : border_and_padding_.block_start;
NGLineBreaker line_breaker(Node(), constraint_space_, BreakToken());
- NGInlineItemResults item_results;
- while (true) {
- line_breaker.NextLine(&item_results, this);
- if (item_results.IsEmpty())
- break;
- CreateLine(&item_results, line_breaker.CreateBreakToken());
- item_results.clear();
- }
+ NGLineInfo line_info;
+ while (line_breaker.NextLine(&line_info, this))
+ CreateLine(&line_info, line_breaker.CreateBreakToken());
// TODO(crbug.com/716930): Avoid calculating border/padding twice.
if (!BreakToken())

Powered by Google App Engine
This is Rietveld 408576698