Commit edd5858b authored by Koji Ishii's avatar Koji Ishii Committed by Commit Bot

[LayoutNG] Cleanup computing margins/border/padding in NGLineBreaker

1. Padding for atomic inline isn't used. Removed computing it.
2. Both converting to NGBoxStrut and then to NGLineBoxStrut
   should use the same writing-mode. Added ng_length_utils
   functions for the two conversions to occur at the same
   place.

Bug: 636993
Cq-Include-Trybots: luci.chromium.try:linux_layout_tests_layout_ng
Change-Id: I3deace37ae5334af0f919d4c557effe067328da9
Reviewed-on: https://chromium-review.googlesource.com/1181004
Commit-Queue: Koji Ishii <kojii@chromium.org>
Reviewed-by: default avatarChristian Biesinger <cbiesinger@chromium.org>
Reviewed-by: default avatarEmil A Eklund <eae@chromium.org>
Cr-Commit-Position: refs/heads/master@{#586218}
parent 2a939e1c
...@@ -49,8 +49,6 @@ NGPhysicalBoxStrut NGBoxStrut::ConvertToPhysical( ...@@ -49,8 +49,6 @@ NGPhysicalBoxStrut NGBoxStrut::ConvertToPhysical(
} }
} }
// Converts physical dimensions to logical ones per
// https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
NGBoxStrut NGPhysicalBoxStrut::ConvertToLogical(WritingMode writing_mode, NGBoxStrut NGPhysicalBoxStrut::ConvertToLogical(WritingMode writing_mode,
TextDirection direction) const { TextDirection direction) const {
NGBoxStrut strut; NGBoxStrut strut;
...@@ -74,6 +72,13 @@ NGBoxStrut NGPhysicalBoxStrut::ConvertToLogical(WritingMode writing_mode, ...@@ -74,6 +72,13 @@ NGBoxStrut NGPhysicalBoxStrut::ConvertToLogical(WritingMode writing_mode,
return strut; return strut;
} }
NGLineBoxStrut NGPhysicalBoxStrut::ConvertToLineLogical(
WritingMode writing_mode,
TextDirection direction) const {
return NGLineBoxStrut(ConvertToLogical(writing_mode, direction),
IsFlippedLinesWritingMode(writing_mode));
}
String NGBoxStrut::ToString() const { String NGBoxStrut::ToString() const {
return String::Format("Inline: (%d %d) Block: (%d %d)", inline_start.ToInt(), return String::Format("Inline: (%d %d) Block: (%d %d)", inline_start.ToInt(),
inline_end.ToInt(), block_start.ToInt(), inline_end.ToInt(), block_start.ToInt(),
......
...@@ -130,7 +130,14 @@ struct CORE_EXPORT NGPhysicalBoxStrut { ...@@ -130,7 +130,14 @@ struct CORE_EXPORT NGPhysicalBoxStrut {
LayoutUnit left) LayoutUnit left)
: top(top), right(right), bottom(bottom), left(left) {} : top(top), right(right), bottom(bottom), left(left) {}
// Converts physical dimensions to logical ones per
// https://drafts.csswg.org/css-writing-modes-3/#logical-to-physical
NGBoxStrut ConvertToLogical(WritingMode, TextDirection) const; NGBoxStrut ConvertToLogical(WritingMode, TextDirection) const;
// Converts physical dimensions to line-relative logical ones per
// https://drafts.csswg.org/css-writing-modes-3/#line-directions
NGLineBoxStrut ConvertToLineLogical(WritingMode, TextDirection) const;
NGPixelSnappedPhysicalBoxStrut SnapToDevicePixels() const; NGPixelSnappedPhysicalBoxStrut SnapToDevicePixels() const;
LayoutUnit HorizontalSum() const { return left + right; } LayoutUnit HorizontalSum() const { return left + right; }
......
...@@ -50,7 +50,8 @@ struct CORE_EXPORT NGInlineItemResult { ...@@ -50,7 +50,8 @@ struct CORE_EXPORT NGInlineItemResult {
// NGLayoutResult for atomic inline items. // NGLayoutResult for atomic inline items.
scoped_refptr<NGLayoutResult> layout_result; scoped_refptr<NGLayoutResult> layout_result;
// Margins, borders, and padding for atomic inline items and open tags. // Margins, borders, and padding for open tags.
// Margins are set for atomic inlines too.
NGLineBoxStrut margins; NGLineBoxStrut margins;
NGLineBoxStrut borders; NGLineBoxStrut borders;
NGLineBoxStrut padding; NGLineBoxStrut padding;
......
...@@ -782,14 +782,12 @@ void NGLineBreaker::HandleAtomicInline(const NGInlineItem& item) { ...@@ -782,14 +782,12 @@ void NGLineBreaker::HandleAtomicInline(const NGInlineItem& item) {
: sizes.max_size; : sizes.max_size;
} }
// For the inline layout purpose, only inline-margins are needed, computed for
// the line's writing-mode.
DCHECK(item.Style()); DCHECK(item.Style());
const ComputedStyle& style = *item.Style(); const ComputedStyle& style = *item.Style();
bool is_flipped_lines = style.IsFlippedLinesWritingMode(); item_result->margins =
item_result->margins = NGLineBoxStrut( ComputeLineMarginsForVisualContainer(constraint_space_, style);
ComputeMarginsForVisualContainer(constraint_space_, style),
IsFlippedLinesWritingMode(constraint_space_.GetWritingMode()));
item_result->padding = NGLineBoxStrut(
ComputePadding(constraint_space_, style), is_flipped_lines);
item_result->inline_size += item_result->margins.InlineSum(); item_result->inline_size += item_result->margins.InlineSum();
if (state_ == LineBreakState::kLeading) if (state_ == LineBreakState::kLeading)
...@@ -915,14 +913,10 @@ bool NGLineBreaker::ComputeOpenTagResult( ...@@ -915,14 +913,10 @@ bool NGLineBreaker::ComputeOpenTagResult(
if (item.ShouldCreateBoxFragment() && if (item.ShouldCreateBoxFragment() &&
(style.HasBorder() || style.HasPadding() || (style.HasBorder() || style.HasPadding() ||
(style.HasMargin() && item_result->has_edge))) { (style.HasMargin() && item_result->has_edge))) {
bool is_flipped_lines = style.IsFlippedLinesWritingMode(); item_result->borders = ComputeLineBorders(constraint_space, style);
item_result->borders = NGLineBoxStrut( item_result->padding = ComputeLinePadding(constraint_space, style);
ComputeBorders(constraint_space, style), is_flipped_lines);
item_result->padding = NGLineBoxStrut(
ComputePadding(constraint_space, style), is_flipped_lines);
if (item_result->has_edge) { if (item_result->has_edge) {
item_result->margins = NGLineBoxStrut( item_result->margins = ComputeLineMarginsForSelf(constraint_space, style);
ComputeMarginsForSelf(constraint_space, style), is_flipped_lines);
item_result->inline_size = item_result->margins.inline_start + item_result->inline_size = item_result->margins.inline_start +
item_result->borders.inline_start + item_result->borders.inline_start +
item_result->padding.inline_start; item_result->padding.inline_start;
......
...@@ -638,11 +638,12 @@ NGBoxStrut ComputeMarginsFor(const NGConstraintSpace& constraint_space, ...@@ -638,11 +638,12 @@ NGBoxStrut ComputeMarginsFor(const NGConstraintSpace& constraint_space,
.ConvertToLogical(compute_for.GetWritingMode(), compute_for.Direction()); .ConvertToLogical(compute_for.GetWritingMode(), compute_for.Direction());
} }
NGBoxStrut ComputeMarginsForVisualContainer( NGLineBoxStrut ComputeLineMarginsForVisualContainer(
const NGConstraintSpace& constraint_space, const NGConstraintSpace& constraint_space,
const ComputedStyle& style) { const ComputedStyle& style) {
return ComputePhysicalMargins(constraint_space, style) return ComputePhysicalMargins(constraint_space, style)
.ConvertToLogical(constraint_space.GetWritingMode(), TextDirection::kLtr); .ConvertToLineLogical(constraint_space.GetWritingMode(),
TextDirection::kLtr);
} }
NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace& constraint_space, NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace& constraint_space,
...@@ -651,6 +652,13 @@ NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace& constraint_space, ...@@ -651,6 +652,13 @@ NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace& constraint_space,
.ConvertToLogical(style.GetWritingMode(), style.Direction()); .ConvertToLogical(style.GetWritingMode(), style.Direction());
} }
NGLineBoxStrut ComputeLineMarginsForSelf(
const NGConstraintSpace& constraint_space,
const ComputedStyle& style) {
return ComputePhysicalMargins(constraint_space, style)
.ConvertToLineLogical(style.GetWritingMode(), style.Direction());
}
NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style, NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style,
NGLayoutInputNode child) { NGLayoutInputNode child) {
// An inline child just produces line-boxes which don't have any margins. // An inline child just produces line-boxes which don't have any margins.
...@@ -704,6 +712,12 @@ NGBoxStrut ComputeBorders(const NGConstraintSpace& constraint_space, ...@@ -704,6 +712,12 @@ NGBoxStrut ComputeBorders(const NGConstraintSpace& constraint_space,
return ComputeBorders(constraint_space, node.Style()); return ComputeBorders(constraint_space, node.Style());
} }
NGLineBoxStrut ComputeLineBorders(const NGConstraintSpace& constraint_space,
const ComputedStyle& style) {
return NGLineBoxStrut(ComputeBorders(constraint_space, style),
style.IsFlippedLinesWritingMode());
}
NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space, NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space,
const ComputedStyle& style) { const ComputedStyle& style) {
// If we are producing an anonymous fragment (e.g. a column) we shouldn't // If we are producing an anonymous fragment (e.g. a column) we shouldn't
...@@ -744,6 +758,12 @@ NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space, ...@@ -744,6 +758,12 @@ NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space,
return padding; return padding;
} }
NGLineBoxStrut ComputeLinePadding(const NGConstraintSpace& constraint_space,
const ComputedStyle& style) {
return NGLineBoxStrut(ComputePadding(constraint_space, style),
style.IsFlippedLinesWritingMode());
}
void ResolveInlineMargins(const ComputedStyle& style, void ResolveInlineMargins(const ComputedStyle& style,
const ComputedStyle& containing_block_style, const ComputedStyle& containing_block_style,
LayoutUnit available_inline_size, LayoutUnit available_inline_size,
......
...@@ -149,21 +149,29 @@ CORE_EXPORT LayoutUnit ResolveUsedColumnGap(LayoutUnit available_size, ...@@ -149,21 +149,29 @@ CORE_EXPORT LayoutUnit ResolveUsedColumnGap(LayoutUnit available_size,
// Compute physical margins. // Compute physical margins.
CORE_EXPORT NGPhysicalBoxStrut ComputePhysicalMargins(const NGConstraintSpace&, CORE_EXPORT NGPhysicalBoxStrut ComputePhysicalMargins(const NGConstraintSpace&,
const ComputedStyle&); const ComputedStyle&);
// Compute margins for the specified NGConstraintSpace. // Compute margins for the specified NGConstraintSpace.
CORE_EXPORT NGBoxStrut ComputeMarginsFor(const NGConstraintSpace&, CORE_EXPORT NGBoxStrut ComputeMarginsFor(const NGConstraintSpace&,
const ComputedStyle&, const ComputedStyle&,
const NGConstraintSpace& compute_for); const NGConstraintSpace& compute_for);
// Compute margins for the NGConstraintSpace.
CORE_EXPORT NGBoxStrut ComputeMarginsForContainer(const NGConstraintSpace&,
const ComputedStyle&);
// Compute margins for the NGConstraintSpace in the visual order.
CORE_EXPORT NGBoxStrut
ComputeMarginsForVisualContainer(const NGConstraintSpace&,
const ComputedStyle&);
// Compute margins for the style owner. // Compute margins for the style owner.
CORE_EXPORT NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace&, CORE_EXPORT NGBoxStrut ComputeMarginsForSelf(const NGConstraintSpace&,
const ComputedStyle&); const ComputedStyle&);
// Compute line logical margins for the style owner.
//
// The "line" versions compute line-relative logical values. See NGLineBoxStrut
// for more details.
CORE_EXPORT NGLineBoxStrut ComputeLineMarginsForSelf(const NGConstraintSpace&,
const ComputedStyle&);
// Compute line logical margins for the constraint space, in the visual order
// (always assumes LTR, ignoring the direction) for inline layout algorithm.
CORE_EXPORT NGLineBoxStrut
ComputeLineMarginsForVisualContainer(const NGConstraintSpace&,
const ComputedStyle&);
// Compute margins for a child during the min-max size calculation. // Compute margins for a child during the min-max size calculation.
CORE_EXPORT NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style, CORE_EXPORT NGBoxStrut ComputeMinMaxMargins(const ComputedStyle& parent_style,
NGLayoutInputNode child); NGLayoutInputNode child);
...@@ -174,12 +182,18 @@ CORE_EXPORT NGBoxStrut ComputeBorders(const NGConstraintSpace&, ...@@ -174,12 +182,18 @@ CORE_EXPORT NGBoxStrut ComputeBorders(const NGConstraintSpace&,
CORE_EXPORT NGBoxStrut ComputeBorders(const NGConstraintSpace&, CORE_EXPORT NGBoxStrut ComputeBorders(const NGConstraintSpace&,
const NGLayoutInputNode); const NGLayoutInputNode);
CORE_EXPORT NGLineBoxStrut ComputeLineBorders(const NGConstraintSpace&,
const ComputedStyle&);
CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&, CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&,
const ComputedStyle&); const ComputedStyle&);
CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&, CORE_EXPORT NGBoxStrut ComputePadding(const NGConstraintSpace&,
const NGLayoutInputNode); const NGLayoutInputNode);
CORE_EXPORT NGLineBoxStrut ComputeLinePadding(const NGConstraintSpace&,
const ComputedStyle&);
// Convert inline margins from computed to used values. This will resolve 'auto' // Convert inline margins from computed to used values. This will resolve 'auto'
// values and over-constrainedness. This uses the available size from the // values and over-constrainedness. This uses the available size from the
// constraint space and inline size to compute the margins that are auto, if // constraint space and inline size to compute the margins that are auto, if
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment