mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
layout: Compute intrinsic sizes for flex items and flex containers (#32854)
Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com> Co-authored-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
7495ba20a5
commit
974c9dc89a
42 changed files with 625 additions and 222 deletions
|
@ -204,17 +204,36 @@ pub(crate) trait ComputedValuesExt {
|
|||
containing_block: &ContainingBlock,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto>;
|
||||
fn content_box_size_for_box_size(
|
||||
&self,
|
||||
box_size: LogicalVec2<LengthOrAuto>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto>;
|
||||
fn content_min_box_size(
|
||||
&self,
|
||||
containing_block: &ContainingBlock,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto>;
|
||||
fn content_min_box_size_for_min_size(
|
||||
&self,
|
||||
box_size: LogicalVec2<LengthOrAuto>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto>;
|
||||
fn content_max_box_size(
|
||||
&self,
|
||||
containing_block: &ContainingBlock,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<Option<Length>>;
|
||||
fn content_max_box_size_for_max_size(
|
||||
&self,
|
||||
box_size: LogicalVec2<Option<Length>>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<Option<Length>>;
|
||||
fn padding_border_margin(&self, containing_block: &ContainingBlock) -> PaddingBorderMargin;
|
||||
fn padding_border_margin_for_intrinsic_size(
|
||||
&self,
|
||||
writing_mode: WritingMode,
|
||||
) -> PaddingBorderMargin;
|
||||
fn padding(
|
||||
&self,
|
||||
containing_block_writing_mode: WritingMode,
|
||||
|
@ -316,6 +335,14 @@ impl ComputedValuesExt for ComputedValues {
|
|||
let box_size = self
|
||||
.box_size(containing_block.style.writing_mode)
|
||||
.percentages_relative_to(containing_block);
|
||||
self.content_box_size_for_box_size(box_size, pbm)
|
||||
}
|
||||
|
||||
fn content_box_size_for_box_size(
|
||||
&self,
|
||||
box_size: LogicalVec2<LengthOrAuto>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto> {
|
||||
match self.get_position().box_sizing {
|
||||
BoxSizing::ContentBox => box_size,
|
||||
BoxSizing::BorderBox => LogicalVec2 {
|
||||
|
@ -336,9 +363,17 @@ impl ComputedValuesExt for ComputedValues {
|
|||
containing_block: &ContainingBlock,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto> {
|
||||
let min_box_size = self
|
||||
let box_size = self
|
||||
.min_box_size(containing_block.style.writing_mode)
|
||||
.percentages_relative_to(containing_block);
|
||||
self.content_min_box_size_for_min_size(box_size, pbm)
|
||||
}
|
||||
|
||||
fn content_min_box_size_for_min_size(
|
||||
&self,
|
||||
min_box_size: LogicalVec2<LengthOrAuto>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<LengthOrAuto> {
|
||||
match self.get_position().box_sizing {
|
||||
BoxSizing::ContentBox => min_box_size,
|
||||
BoxSizing::BorderBox => LogicalVec2 {
|
||||
|
@ -361,6 +396,15 @@ impl ComputedValuesExt for ComputedValues {
|
|||
let max_box_size = self
|
||||
.max_box_size(containing_block.style.writing_mode)
|
||||
.percentages_relative_to(containing_block);
|
||||
|
||||
self.content_max_box_size_for_max_size(max_box_size, pbm)
|
||||
}
|
||||
|
||||
fn content_max_box_size_for_max_size(
|
||||
&self,
|
||||
max_box_size: LogicalVec2<Option<Length>>,
|
||||
pbm: &PaddingBorderMargin,
|
||||
) -> LogicalVec2<Option<Length>> {
|
||||
match self.get_position().box_sizing {
|
||||
BoxSizing::ContentBox => max_box_size,
|
||||
BoxSizing::BorderBox => {
|
||||
|
@ -398,6 +442,28 @@ impl ComputedValuesExt for ComputedValues {
|
|||
}
|
||||
}
|
||||
|
||||
fn padding_border_margin_for_intrinsic_size(
|
||||
&self,
|
||||
writing_mode: WritingMode,
|
||||
) -> PaddingBorderMargin {
|
||||
let padding = self
|
||||
.padding(writing_mode)
|
||||
.percentages_relative_to(Length::zero());
|
||||
let border = self.border_width(writing_mode);
|
||||
let margin = self
|
||||
.margin(writing_mode)
|
||||
.percentages_relative_to(Length::zero());
|
||||
PaddingBorderMargin {
|
||||
padding_border_sums: LogicalVec2 {
|
||||
inline: (padding.inline_sum() + border.inline_sum()).into(),
|
||||
block: (padding.block_sum() + border.block_sum()).into(),
|
||||
},
|
||||
padding: padding.into(),
|
||||
border: border.into(),
|
||||
margin: margin.map(|t| t.map(|m| m.into())),
|
||||
}
|
||||
}
|
||||
|
||||
fn padding(
|
||||
&self,
|
||||
containing_block_writing_mode: WritingMode,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue