Constify Val::resolve and BorderRadius::resolve (#18595)

# Objective

Constify `Val::resolve` and  `BorderRadius::resolve`

# Solution

* Replace uses of `Vec2::min_element` and `Vec2::max_element` with `min`
and `max` called on the components.
* Make `BorderRadius::resolve` and `BorderRadius::resolve_single_corner`
`const`.
* Swap the order of the `bottom_left` and `bottom_right` fields of
`BorderRadius` and `ResolvedBorderRadius` so they match the ccw order
used in the shader and in css.
This commit is contained in:
ickshonpe 2025-05-26 23:17:52 +01:00 committed by GitHub
parent 2e37783242
commit f415e2e96d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 15 deletions

View File

@ -260,7 +260,7 @@ impl Val {
/// and `physical_target_size` context values. /// and `physical_target_size` context values.
/// ///
/// Returns a [`ValArithmeticError::NonEvaluable`] if the [`Val`] is impossible to resolve into a concrete value. /// Returns a [`ValArithmeticError::NonEvaluable`] if the [`Val`] is impossible to resolve into a concrete value.
pub fn resolve( pub const fn resolve(
self, self,
scale_factor: f32, scale_factor: f32,
physical_base_value: f32, physical_base_value: f32,
@ -271,8 +271,12 @@ impl Val {
Val::Px(value) => Ok(value * scale_factor), Val::Px(value) => Ok(value * scale_factor),
Val::Vw(value) => Ok(physical_target_size.x * value / 100.0), Val::Vw(value) => Ok(physical_target_size.x * value / 100.0),
Val::Vh(value) => Ok(physical_target_size.y * value / 100.0), Val::Vh(value) => Ok(physical_target_size.y * value / 100.0),
Val::VMin(value) => Ok(physical_target_size.min_element() * value / 100.0), Val::VMin(value) => {
Val::VMax(value) => Ok(physical_target_size.max_element() * value / 100.0), Ok(physical_target_size.x.min(physical_target_size.y) * value / 100.0)
}
Val::VMax(value) => {
Ok(physical_target_size.x.max(physical_target_size.y) * value / 100.0)
}
Val::Auto => Err(ValArithmeticError::NonEvaluable), Val::Auto => Err(ValArithmeticError::NonEvaluable),
} }
} }

View File

@ -162,8 +162,8 @@ impl ComputedNode {
ResolvedBorderRadius { ResolvedBorderRadius {
top_left: compute_radius(self.border_radius.top_left, outer_distance), top_left: compute_radius(self.border_radius.top_left, outer_distance),
top_right: compute_radius(self.border_radius.top_right, outer_distance), top_right: compute_radius(self.border_radius.top_right, outer_distance),
bottom_left: compute_radius(self.border_radius.bottom_left, outer_distance),
bottom_right: compute_radius(self.border_radius.bottom_right, outer_distance), bottom_right: compute_radius(self.border_radius.bottom_right, outer_distance),
bottom_left: compute_radius(self.border_radius.bottom_left, outer_distance),
} }
} }
@ -200,8 +200,8 @@ impl ComputedNode {
ResolvedBorderRadius { ResolvedBorderRadius {
top_left: clamp_corner(self.border_radius.top_left, s, b.xy()), top_left: clamp_corner(self.border_radius.top_left, s, b.xy()),
top_right: clamp_corner(self.border_radius.top_right, s, b.zy()), top_right: clamp_corner(self.border_radius.top_right, s, b.zy()),
bottom_left: clamp_corner(self.border_radius.bottom_right, s, b.zw()),
bottom_right: clamp_corner(self.border_radius.bottom_left, s, b.xw()), bottom_right: clamp_corner(self.border_radius.bottom_left, s, b.xw()),
bottom_left: clamp_corner(self.border_radius.bottom_right, s, b.zw()),
} }
} }
@ -2240,8 +2240,8 @@ pub struct GlobalZIndex(pub i32);
pub struct BorderRadius { pub struct BorderRadius {
pub top_left: Val, pub top_left: Val,
pub top_right: Val, pub top_right: Val,
pub bottom_left: Val,
pub bottom_right: Val, pub bottom_right: Val,
pub bottom_left: Val,
} }
impl Default for BorderRadius { impl Default for BorderRadius {
@ -2453,27 +2453,28 @@ impl BorderRadius {
/// Resolve the border radius for a single corner from the given context values. /// Resolve the border radius for a single corner from the given context values.
/// Returns the radius of the corner in physical pixels. /// Returns the radius of the corner in physical pixels.
pub fn resolve_single_corner( pub const fn resolve_single_corner(
radius: Val, radius: Val,
scale_factor: f32, scale_factor: f32,
min_length: f32, min_length: f32,
viewport_size: Vec2, viewport_size: Vec2,
) -> f32 { ) -> f32 {
radius if let Ok(radius) = radius.resolve(scale_factor, min_length, viewport_size) {
.resolve(scale_factor, min_length, viewport_size) radius.clamp(0., 0.5 * min_length)
.unwrap_or(0.) } else {
.clamp(0., 0.5 * min_length) 0.
}
} }
/// Resolve the border radii for the corners from the given context values. /// Resolve the border radii for the corners from the given context values.
/// Returns the radii of the each corner in physical pixels. /// Returns the radii of the each corner in physical pixels.
pub fn resolve( pub const fn resolve(
&self, &self,
scale_factor: f32, scale_factor: f32,
node_size: Vec2, node_size: Vec2,
viewport_size: Vec2, viewport_size: Vec2,
) -> ResolvedBorderRadius { ) -> ResolvedBorderRadius {
let length = node_size.min_element(); let length = node_size.x.min(node_size.y);
ResolvedBorderRadius { ResolvedBorderRadius {
top_left: Self::resolve_single_corner( top_left: Self::resolve_single_corner(
self.top_left, self.top_left,
@ -2511,16 +2512,16 @@ impl BorderRadius {
pub struct ResolvedBorderRadius { pub struct ResolvedBorderRadius {
pub top_left: f32, pub top_left: f32,
pub top_right: f32, pub top_right: f32,
pub bottom_left: f32,
pub bottom_right: f32, pub bottom_right: f32,
pub bottom_left: f32,
} }
impl ResolvedBorderRadius { impl ResolvedBorderRadius {
pub const ZERO: Self = Self { pub const ZERO: Self = Self {
top_left: 0., top_left: 0.,
top_right: 0., top_right: 0.,
bottom_left: 0.,
bottom_right: 0., bottom_right: 0.,
bottom_left: 0.,
}; };
} }