layout: make padding and border use Au in pbm (#31289)

* use au for padding and border in pbm

* review fix
This commit is contained in:
atbrakhi 2024-02-12 23:49:50 +01:00 committed by GitHub
parent f25fe3539a
commit 8ba251c95f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 168 additions and 128 deletions

View file

@ -900,7 +900,7 @@ impl FloatBox {
// or non-replaced.
let pbm = style.padding_border_margin(containing_block);
let margin = pbm.margin.auto_is(Length::zero);
let pbm_sums = &(&pbm.padding + &pbm.border) + &margin;
let pbm_sums = &(&pbm.padding + &pbm.border) + &margin.clone().into();
let (content_size, children);
match self.contents {
@ -918,7 +918,7 @@ impl FloatBox {
let tentative_inline_size = box_size.inline.auto_is(|| {
let available_size =
containing_block.inline_size - pbm_sums.inline_sum();
containing_block.inline_size - pbm_sums.inline_sum().into();
non_replaced
.inline_content_sizes(layout_context)
.shrink_to_fit(available_size.into())
@ -976,8 +976,8 @@ impl FloatBox {
style.clone(),
children,
content_rect,
pbm.padding,
pbm.border,
pbm.padding.into(),
pbm.border.into(),
margin,
// Clearance is handled internally by the float placement logic, so there's no need
// to store it explicitly in the fragment.

View file

@ -648,13 +648,14 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> {
);
if inline_box.is_first_fragment {
self.current_line.inline_position += inline_box_state.pbm.padding.inline_start +
inline_box_state.pbm.border.inline_start +
inline_box_state
.pbm
.margin
.inline_start
.auto_is(Length::zero);
self.current_line.inline_position += Length::from(
inline_box_state.pbm.padding.inline_start +
inline_box_state.pbm.border.inline_start,
) + inline_box_state
.pbm
.margin
.inline_start
.auto_is(Length::zero)
}
let line_item = inline_box_state
@ -686,10 +687,10 @@ impl<'a, 'b> InlineFormattingContextState<'a, 'b> {
}
if inline_box_state.is_last_fragment {
let pbm_end = inline_box_state.pbm.padding.inline_end +
inline_box_state.pbm.border.inline_end +
inline_box_state.pbm.margin.inline_end.auto_is(Length::zero);
self.current_line_segment.inline_size += pbm_end;
let pbm_end = Length::from(
inline_box_state.pbm.padding.inline_end + inline_box_state.pbm.border.inline_end,
) + inline_box_state.pbm.margin.inline_end.auto_is(Length::zero);
self.current_line_segment.inline_size += pbm_end.into();
}
}
@ -1819,7 +1820,7 @@ impl IndependentFormattingContext {
let style = self.style();
let pbm = style.padding_border_margin(ifc.containing_block);
let margin = pbm.margin.auto_is(Length::zero);
let pbm_sums = &(&pbm.padding + &pbm.border) + &margin;
let pbm_sums = &(&pbm.padding + &pbm.border) + &margin.clone().into();
let mut child_positioning_context = None;
// We need to know the inline size of the atomic before deciding whether to do the line break.
@ -1836,16 +1837,16 @@ impl IndependentFormattingContext {
.make_fragments(&replaced.style, size.clone());
let content_rect = LogicalRect {
start_corner: pbm_sums.start_offset(),
size: size.into(),
size,
};
BoxFragment::new(
replaced.base_fragment_info,
replaced.style.clone(),
fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
None, /* clearance */
CollapsedBlockMargins::zero(),
@ -1865,7 +1866,8 @@ impl IndependentFormattingContext {
// https://drafts.csswg.org/css2/visudet.html#inlineblock-width
let tentative_inline_size = box_size.inline.auto_is(|| {
let available_size = ifc.containing_block.inline_size - pbm_sums.inline_sum();
let available_size =
ifc.containing_block.inline_size - pbm_sums.inline_sum().into();
non_replaced
.inline_content_sizes(layout_context)
.shrink_to_fit(available_size.into())
@ -1915,8 +1917,8 @@ impl IndependentFormattingContext {
let content_rect = LogicalRect {
start_corner: pbm_sums.start_offset(),
size: LogicalVec2 {
block: block_size,
inline: inline_size,
block: block_size.into(),
inline: inline_size.into(),
},
};
@ -1924,9 +1926,9 @@ impl IndependentFormattingContext {
non_replaced.base_fragment_info,
non_replaced.style.clone(),
independent_layout.fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
None,
CollapsedBlockMargins::zero(),
@ -1943,11 +1945,11 @@ impl IndependentFormattingContext {
ifc.process_soft_wrap_opportunity();
}
let size = &pbm_sums.sum() + &fragment.content_rect.size;
let size = &pbm_sums.sum().into() + &fragment.content_rect.size;
let baseline_offset = fragment
.baselines
.last
.map(|baseline| Au::from(pbm_sums.block_start) + baseline)
.map(|baseline| pbm_sums.block_start + baseline)
.unwrap_or(size.block.into());
let (block_sizes, baseline_offset_in_parent) =

View file

@ -298,12 +298,17 @@ impl InlineBoxLineItem {
let mut margin = self.pbm.margin.auto_is(Length::zero);
if !self.is_first_fragment {
padding.inline_start = Length::zero();
border.inline_start = Length::zero();
padding.inline_start = Au::zero();
border.inline_start = Au::zero();
margin.inline_start = Length::zero();
}
let pbm_sums = &(&padding + &border) + &margin;
state.inline_position += pbm_sums.inline_start;
if !self.is_last_fragment_of_ib_split {
padding.inline_end = Au::zero();
border.inline_end = Au::zero();
margin.inline_end = Length::zero();
}
let pbm_sums = &(&padding + &border) + &margin.map(|t| (*t).into());
state.inline_position += pbm_sums.inline_start.into();
let space_above_baseline = self.calculate_space_above_baseline();
let block_start_offset = self.calculate_block_start(state, space_above_baseline);
@ -336,14 +341,14 @@ impl InlineBoxLineItem {
// potential block-in-inline split and this line included the actual end of this
// fragment (it doesn't continue on the next line).
if !self.is_last_fragment_of_ib_split || !saw_end {
padding.inline_end = Length::zero();
border.inline_end = Length::zero();
padding.inline_end = Au::zero();
border.inline_end = Au::zero();
margin.inline_end = Length::zero();
}
let pbm_sums = &(&padding + &border) + &margin;
let pbm_sums = &(&padding + &border) + &margin.clone().into();
// If the inline box didn't have any content at all, don't add a Fragment for it.
let box_has_padding_border_or_margin = pbm_sums.inline_sum() > Length::zero();
let box_has_padding_border_or_margin = pbm_sums.inline_sum() > Au::zero();
let box_had_absolutes =
original_nested_positioning_context_length != nested_state.positioning_context.len();
if !self.is_first_fragment &&
@ -374,22 +379,19 @@ impl InlineBoxLineItem {
content_rect.start_corner += &relative_adjustement(&style, state.ifc_containing_block);
}
// NB: There is no need to set a baseline offset for this BoxFragment, because the
// baselines of this InlineFormattingContext is what will propagate to `display:
// inline-block` ancestors.
let mut fragment = BoxFragment::new(
self.base_fragment_info,
self.style.clone(),
fragments,
content_rect,
padding,
border,
padding.into(),
border.into(),
margin,
None, /* clearance */
CollapsedBlockMargins::zero(),
);
state.inline_position = nested_state.inline_position + pbm_sums.inline_end;
state.inline_position = nested_state.inline_position + pbm_sums.inline_end.into();
if let Some(mut positioning_context) = positioning_context.take() {
assert!(original_nested_positioning_context_length == PositioningContextLength::zero());

View file

@ -126,7 +126,7 @@ impl BlockLevelBox {
_ => return false,
};
if pbm.padding.block_start != Length::zero() || pbm.border.block_start != Length::zero() {
if pbm.padding.block_start != Au::zero() || pbm.border.block_start != Au::zero() {
return false;
}
@ -142,7 +142,7 @@ impl BlockLevelBox {
let margin_inline_start = pbm.margin.inline_start.auto_is(Length::zero);
let margin_inline_end = pbm.margin.inline_end.auto_is(Length::zero);
containing_block.inline_size -
pbm.padding_border_sums.inline -
pbm.padding_border_sums.inline.into() -
margin_inline_start -
margin_inline_end
})
@ -169,10 +169,7 @@ impl BlockLevelBox {
style.content_block_size().is_definitely_zero() || style.content_block_size().is_auto();
let min_block_size_zero =
style.min_block_size().is_definitely_zero() || style.min_block_size().is_auto();
if !min_block_size_zero ||
!block_size_zero ||
pbm.padding_border_sums.block != Length::zero()
{
if !min_block_size_zero || !block_size_zero || pbm.padding_border_sums.block != Au::zero() {
return false;
}
@ -637,9 +634,9 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
let computed_block_size = style.content_block_size();
let start_margin_can_collapse_with_children =
pbm.padding.block_start == Length::zero() && pbm.border.block_start == Length::zero();
let end_margin_can_collapse_with_children = pbm.padding.block_end == Length::zero() &&
pbm.border.block_end == Length::zero() &&
pbm.padding.block_start == Au::zero() && pbm.border.block_start == Au::zero();
let end_margin_can_collapse_with_children = pbm.padding.block_end == Au::zero() &&
pbm.border.block_end == Au::zero() &&
computed_block_size.is_auto();
let mut clearance = None;
@ -688,10 +685,9 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
// NB: This will be a no-op if we're collapsing margins with our children since that
// can only happen if we have no block-start padding and border.
sequential_layout_state.advance_block_position(
(pbm.padding.block_start +
pbm.padding.block_start +
pbm.border.block_start +
clearance.unwrap_or_else(Au::zero).into())
.into(),
clearance.unwrap_or_else(Au::zero),
);
// We are about to lay out children. Update the offset between the block formatting
@ -703,8 +699,8 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
.floats
.containing_block_info
.inline_start +
pbm.padding.inline_start.into() +
pbm.border.inline_start.into() +
pbm.padding.inline_start +
pbm.border.inline_start +
margin.inline_start.into();
let new_cb_offsets = ContainingBlockPositionInfo {
block_start: sequential_layout_state.bfc_relative_block_position,
@ -754,7 +750,7 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
let computed_min_block_size = style.min_block_size();
block_margins_collapsed_with_children.collapsed_through = collapsible_margins_in_children
.collapsed_through &&
pbm.padding_border_sums.block == Length::zero() &&
pbm.padding_border_sums.block == Au::zero() &&
(computed_block_size.is_definitely_zero() || computed_block_size.is_auto()) &&
(computed_min_block_size.is_definitely_zero() || computed_min_block_size.is_auto());
@ -778,7 +774,9 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
// the block direction. In that case, the ceiling for floats is effectively raised
// as long as no floats in the overflowing content lowered it.
sequential_layout_state.advance_block_position(
(block_size - content_block_size + pbm.padding.block_end + pbm.border.block_end).into(),
Au::from(block_size - content_block_size) +
pbm.padding.block_end +
pbm.border.block_end,
);
if !end_margin_can_collapse_with_children {
@ -791,12 +789,12 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
start_corner: LogicalVec2 {
block: (pbm.padding.block_start +
pbm.border.block_start +
clearance.unwrap_or_else(Au::zero).into()),
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
clearance.unwrap_or_else(Au::zero)),
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start.into(),
},
size: LogicalVec2 {
block: block_size,
inline: containing_block_for_children.inline_size,
block: block_size.into(),
inline: containing_block_for_children.inline_size.into(),
},
};
@ -804,9 +802,9 @@ fn layout_in_flow_non_replaced_block_level_same_formatting_context(
base_fragment_info,
style.clone(),
flow_layout.fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
clearance.map(|t| t.into()),
block_margins_collapsed_with_children,
@ -866,22 +864,25 @@ impl NonReplacedFormattingContext {
let content_rect = LogicalRect {
start_corner: LogicalVec2 {
block: pbm.padding.block_start + pbm.border.block_start,
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
inline: pbm.padding.inline_start +
pbm.border.inline_start +
margin.inline_start.into(),
},
size: LogicalVec2 {
block: block_size,
inline: containing_block_for_children.inline_size,
block: block_size.into(),
inline: containing_block_for_children.inline_size.into(),
},
};
let block_margins_collapsed_with_children = CollapsedBlockMargins::from_margin(&margin);
BoxFragment::new(
self.base_fragment_info,
self.style.clone(),
layout.fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
None, /* clearance */
block_margins_collapsed_with_children,
@ -961,7 +962,7 @@ impl NonReplacedFormattingContext {
containing_block,
&collapsed_margin_block_start,
&pbm,
&content_size + &pbm.padding_border_sums,
&content_size + &pbm.padding_border_sums.clone().into(),
&self.style,
);
} else {
@ -980,11 +981,13 @@ impl NonReplacedFormattingContext {
let minimum_size_of_block = &LogicalVec2 {
inline: min_box_size.inline,
block: block_size.auto_is(|| min_box_size.block),
} + &pbm.padding_border_sums;
}
.into() +
&pbm.padding_border_sums;
let mut placement = PlacementAmongFloats::new(
&sequential_layout_state.floats,
ceiling,
minimum_size_of_block.into(),
minimum_size_of_block,
&pbm,
);
let mut placement_rect;
@ -992,10 +995,9 @@ impl NonReplacedFormattingContext {
loop {
// First try to place the block using the minimum size as the object size.
placement_rect = placement.place();
let proposed_inline_size = Length::from(
placement_rect.size.inline - pbm.padding_border_sums.inline.into(),
)
.clamp_between_extremums(min_box_size.inline, max_box_size.inline);
let proposed_inline_size =
Length::from(placement_rect.size.inline - pbm.padding_border_sums.inline)
.clamp_between_extremums(min_box_size.inline, max_box_size.inline);
// Now lay out the block using the inline size we calculated from the placement.
// Later we'll check to see if the resulting block size is compatible with the
@ -1027,7 +1029,7 @@ impl NonReplacedFormattingContext {
// size of auto. Try to fit it into our precalculated placement among the
// floats. If it fits, then we can stop trying layout candidates.
if placement.try_to_expand_for_auto_block_size(
(content_size.block + pbm.padding_border_sums.block).into(),
Au::from(content_size.block) + pbm.padding_border_sums.block,
&placement_rect.size,
) {
break;
@ -1057,7 +1059,7 @@ impl NonReplacedFormattingContext {
sequential_layout_state,
containing_block,
&pbm,
content_size.inline + pbm.padding_border_sums.inline,
content_size.inline + pbm.padding_border_sums.inline.into(),
placement_rect.into(),
);
}
@ -1079,10 +1081,8 @@ impl NonReplacedFormattingContext {
// Margins can never collapse into independent formatting contexts.
sequential_layout_state.collapse_margins();
sequential_layout_state.advance_block_position(
(pbm.padding_border_sums.block +
content_size.block +
clearance.unwrap_or_else(Length::zero))
.into(),
pbm.padding_border_sums.block +
(content_size.block + clearance.unwrap_or_else(Length::zero)).into(),
);
sequential_layout_state.adjoin_assign(&CollapsedMargin::new(margin.block_end));
@ -1090,19 +1090,22 @@ impl NonReplacedFormattingContext {
start_corner: LogicalVec2 {
block: pbm.padding.block_start +
pbm.border.block_start +
clearance.unwrap_or_else(Length::zero),
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
clearance.unwrap_or_else(Length::zero).into(),
inline: pbm.padding.inline_start +
pbm.border.inline_start +
margin.inline_start.into(),
},
size: content_size,
size: content_size.into(),
};
let block_margins_collapsed_with_children = CollapsedBlockMargins::from_margin(&margin);
BoxFragment::new(
self.base_fragment_info,
self.style.clone(),
layout.fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
clearance,
block_margins_collapsed_with_children,
@ -1142,7 +1145,7 @@ fn layout_in_flow_replaced_block_level<'a>(
// than defined by section 10.3.3. CSS 2 does not define when a UA may put said
// element next to the float or by how much said element may become narrower."
let collapsed_margin_block_start = CollapsedMargin::new(margin_block_start);
let size = &content_size + &pbm.padding_border_sums.clone().into();
let size = &content_size + &pbm.padding_border_sums.clone();
(clearance, (margin_inline_start, margin_inline_end)) =
solve_clearance_and_inline_margins_avoiding_floats(
sequential_layout_state,
@ -1184,22 +1187,23 @@ fn layout_in_flow_replaced_block_level<'a>(
let start_corner = LogicalVec2 {
block: pbm.padding.block_start +
pbm.border.block_start +
clearance.unwrap_or_else(Length::zero),
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start,
clearance.unwrap_or_else(Length::zero).into(),
inline: pbm.padding.inline_start + pbm.border.inline_start + margin.inline_start.into(),
};
let content_rect = LogicalRect {
start_corner,
size: content_size.into(),
size: content_size,
};
let block_margins_collapsed_with_children = CollapsedBlockMargins::from_margin(&margin);
BoxFragment::new(
base_fragment_info,
style.clone(),
fragments,
content_rect,
pbm.padding,
pbm.border,
content_rect.into(),
pbm.padding.into(),
pbm.border.into(),
margin,
clearance,
block_margins_collapsed_with_children,
@ -1238,7 +1242,7 @@ fn solve_containing_block_padding_border_and_margin_for_in_flow_box<'a>(
let margin_inline_start = pbm.margin.inline_start.auto_is(Length::zero);
let margin_inline_end = pbm.margin.inline_end.auto_is(Length::zero);
containing_block.inline_size -
pbm.padding_border_sums.inline -
pbm.padding_border_sums.inline.into() -
margin_inline_start -
margin_inline_end
})
@ -1348,7 +1352,8 @@ fn solve_inline_margins_for_in_flow_block_level(
pbm: &PaddingBorderMargin,
inline_size: Length,
) -> (Length, Length) {
let free_space = containing_block.inline_size - pbm.padding_border_sums.inline - inline_size;
let free_space =
containing_block.inline_size - pbm.padding_border_sums.inline.into() - inline_size;
let margin_inline_start = match (pbm.margin.inline_start, pbm.margin.inline_end) {
(LengthOrAuto::Auto, LengthOrAuto::Auto) => Length::zero().max(free_space / 2.),
(LengthOrAuto::Auto, LengthOrAuto::LengthPercentage(end)) => {