diff --git a/components/layout_2020/flow/mod.rs b/components/layout_2020/flow/mod.rs index f877e702dfe..7321b602d52 100644 --- a/components/layout_2020/flow/mod.rs +++ b/components/layout_2020/flow/mod.rs @@ -21,8 +21,7 @@ use rayon_croissant::ParallelIteratorExt; use servo_arc::Arc; use style::computed_values::position::T as Position; use style::properties::ComputedValues; -use style::values::computed::{Length, LengthOrAuto, LengthPercentage, LengthPercentageOrAuto}; -use style::values::generics::length::MaxSize; +use style::values::computed::{Length, LengthOrAuto}; use style::Zero; mod construct; @@ -365,10 +364,14 @@ fn layout_in_flow_non_replaced_block_level<'a>( let pb = &padding + &border; let pb_inline_sum = pb.inline_sum(); - let box_size = percent_resolved_box_size(style.box_size(), containing_block); - let max_box_size = percent_resolved_max_box_size(style.max_box_size(), containing_block); - let min_box_size = - percent_resolved_box_size(style.min_box_size(), containing_block).auto_is(Length::zero); + let box_size = style.box_size().percentages_relative_to(containing_block); + let max_box_size = style + .max_box_size() + .percentages_relative_to(containing_block); + let min_box_size = style + .min_box_size() + .percentages_relative_to(containing_block) + .auto_is(Length::zero); // https://drafts.csswg.org/css2/visudet.html#min-max-widths let solve_inline_margins = |inline_size| { @@ -529,10 +532,14 @@ fn layout_in_flow_replaced_block_level<'a>( // FIXME(nox): This can divide by zero. let intrinsic_ratio = intrinsic_size.inline.px() / intrinsic_size.block.px(); - let box_size = percent_resolved_box_size(style.box_size(), containing_block); - let min_box_size = - percent_resolved_box_size(style.min_box_size(), containing_block).auto_is(Length::zero); - let max_box_size = percent_resolved_max_box_size(style.max_box_size(), containing_block); + let box_size = style.box_size().percentages_relative_to(containing_block); + let min_box_size = style + .min_box_size() + .percentages_relative_to(containing_block) + .auto_is(Length::zero); + let max_box_size = style + .max_box_size() + .percentages_relative_to(containing_block); let clamp = |inline_size: Length, block_size: Length| { ( @@ -701,37 +708,3 @@ fn solve_inline_margins_for_in_flow_block_level( (LengthOrAuto::LengthPercentage(start), _) => (start, inline_margins - start), } } - -fn percent_resolved_box_size( - box_size: Vec2, - containing_block: &ContainingBlock, -) -> Vec2 { - Vec2 { - inline: box_size - .inline - .percentage_relative_to(containing_block.inline_size), - block: box_size - .block - .maybe_percentage_relative_to(containing_block.block_size.non_auto()), - } -} - -fn percent_resolved_max_box_size( - max_box_size: Vec2>, - containing_block: &ContainingBlock, -) -> Vec2> { - Vec2 { - inline: match max_box_size.inline { - MaxSize::LengthPercentage(max_inline_size) => { - Some(max_inline_size.percentage_relative_to(containing_block.inline_size)) - }, - MaxSize::None => None, - }, - block: match max_box_size.block { - MaxSize::LengthPercentage(max_block_size) => { - max_block_size.maybe_percentage_relative_to(containing_block.block_size.non_auto()) - }, - MaxSize::None => None, - }, - } -} diff --git a/components/layout_2020/geom.rs b/components/layout_2020/geom.rs index 2eafb78051e..562fad5c4f6 100644 --- a/components/layout_2020/geom.rs +++ b/components/layout_2020/geom.rs @@ -2,11 +2,13 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use crate::ContainingBlock; use std::fmt; use std::ops::{Add, AddAssign, Sub}; use style::logical_geometry::{BlockFlowDirection, InlineBaseDirection}; use style::logical_geometry::{PhysicalCorner, WritingMode}; use style::values::computed::{Length, LengthOrAuto, LengthPercentage, LengthPercentageOrAuto}; +use style::values::generics::length::MaxSize; use style::Zero; use style_traits::CSSPixel; @@ -151,6 +153,39 @@ impl flow_relative::Vec2 { } } +impl flow_relative::Vec2 { + pub fn percentages_relative_to( + &self, + containing_block: &ContainingBlock, + ) -> flow_relative::Vec2 { + flow_relative::Vec2 { + inline: self + .inline + .percentage_relative_to(containing_block.inline_size), + block: self + .block + .maybe_percentage_relative_to(containing_block.block_size.non_auto()), + } + } +} + +impl flow_relative::Vec2> { + pub fn percentages_relative_to( + &self, + containing_block: &ContainingBlock, + ) -> flow_relative::Vec2> { + flow_relative::Vec2 { + inline: self + .inline + .to_option() + .map(|lp| lp.percentage_relative_to(containing_block.inline_size)), + block: self.block.to_option().and_then(|olp| { + olp.maybe_percentage_relative_to(containing_block.block_size.non_auto()) + }), + } + } +} + impl flow_relative::Rect { pub fn zero() -> Self { Self { diff --git a/components/style/values/generics/length.rs b/components/style/values/generics/length.rs index 4183f40a942..b2f34058283 100644 --- a/components/style/values/generics/length.rs +++ b/components/style/values/generics/length.rs @@ -207,6 +207,15 @@ impl MaxSize { pub fn none() -> Self { MaxSize::None } + + /// Convert + #[cfg(not(feature = "gecko"))] + pub fn to_option(self) -> Option { + match self { + Self::LengthPercentage(lp) => Some(lp), + Self::None => None, + } + } } /// A generic `` | `` value for the `-moz-tab-size` property.