mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
style: Derive more stuff for clip rects.
I feel a bit weird for using LenghtPercentageOrAuto to implement LengthOrAuto, but I don't think much other code will use it so it seemed a bit better to me. Differential Revision: https://phabricator.services.mozilla.com/D21863
This commit is contained in:
parent
e723a5b7d6
commit
e0b3e5f691
8 changed files with 143 additions and 254 deletions
|
@ -3748,6 +3748,7 @@ fn static_assert() {
|
|||
#[allow(non_snake_case)]
|
||||
pub fn set__moz_image_region(&mut self, v: longhands::_moz_image_region::computed_value::T) {
|
||||
use crate::values::Either;
|
||||
use crate::values::generics::length::LengthPercentageOrAuto::*;
|
||||
|
||||
match v {
|
||||
Either::Second(_auto) => {
|
||||
|
@ -3757,15 +3758,21 @@ fn static_assert() {
|
|||
self.gecko.mImageRegion.height = 0;
|
||||
}
|
||||
Either::First(rect) => {
|
||||
self.gecko.mImageRegion.x = rect.left.map(Au::from).unwrap_or(Au(0)).0;
|
||||
self.gecko.mImageRegion.y = rect.top.map(Au::from).unwrap_or(Au(0)).0;
|
||||
self.gecko.mImageRegion.x = match rect.left {
|
||||
LengthPercentage(v) => v.to_i32_au(),
|
||||
Auto => 0,
|
||||
};
|
||||
self.gecko.mImageRegion.y = match rect.top {
|
||||
LengthPercentage(v) => v.to_i32_au(),
|
||||
Auto => 0,
|
||||
};
|
||||
self.gecko.mImageRegion.height = match rect.bottom {
|
||||
Some(value) => (Au::from(value) - Au(self.gecko.mImageRegion.y)).0,
|
||||
None => 0,
|
||||
LengthPercentage(value) => (Au::from(value) - Au(self.gecko.mImageRegion.y)).0,
|
||||
Auto => 0,
|
||||
};
|
||||
self.gecko.mImageRegion.width = match rect.right {
|
||||
Some(value) => (Au::from(value) - Au(self.gecko.mImageRegion.x)).0,
|
||||
None => 0,
|
||||
LengthPercentage(value) => (Au::from(value) - Au(self.gecko.mImageRegion.x)).0,
|
||||
Auto => 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -3774,6 +3781,7 @@ fn static_assert() {
|
|||
#[allow(non_snake_case)]
|
||||
pub fn clone__moz_image_region(&self) -> longhands::_moz_image_region::computed_value::T {
|
||||
use crate::values::{Auto, Either};
|
||||
use crate::values::generics::length::LengthPercentageOrAuto::*;
|
||||
use crate::values::computed::ClipRect;
|
||||
|
||||
// There is no ideal way to detect auto type for structs::nsRect and its components, so
|
||||
|
@ -3786,10 +3794,10 @@ fn static_assert() {
|
|||
}
|
||||
|
||||
Either::First(ClipRect {
|
||||
top: Some(Au(self.gecko.mImageRegion.y).into()),
|
||||
right: Some(Au(self.gecko.mImageRegion.width + self.gecko.mImageRegion.x).into()),
|
||||
bottom: Some(Au(self.gecko.mImageRegion.height + self.gecko.mImageRegion.y).into()),
|
||||
left: Some(Au(self.gecko.mImageRegion.x).into()),
|
||||
top: LengthPercentage(Au(self.gecko.mImageRegion.y).into()),
|
||||
right: LengthPercentage(Au(self.gecko.mImageRegion.width + self.gecko.mImageRegion.x).into()),
|
||||
bottom: LengthPercentage(Au(self.gecko.mImageRegion.height + self.gecko.mImageRegion.y).into()),
|
||||
left: LengthPercentage(Au(self.gecko.mImageRegion.x).into()),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -3846,38 +3854,43 @@ fn static_assert() {
|
|||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_TOP_AUTO;
|
||||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_RIGHT_AUTO;
|
||||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_BOTTOM_AUTO;
|
||||
use crate::values::generics::length::LengthPercentageOrAuto::*;
|
||||
use crate::values::Either;
|
||||
|
||||
match v {
|
||||
Either::First(rect) => {
|
||||
self.gecko.mClipFlags = NS_STYLE_CLIP_RECT as u8;
|
||||
if let Some(left) = rect.left {
|
||||
self.gecko.mClip.x = left.to_i32_au();
|
||||
} else {
|
||||
self.gecko.mClip.x = 0;
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_LEFT_AUTO as u8;
|
||||
}
|
||||
self.gecko.mClip.x = match rect.left {
|
||||
LengthPercentage(l) => l.to_i32_au(),
|
||||
Auto => {
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_LEFT_AUTO as u8;
|
||||
0
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(top) = rect.top {
|
||||
self.gecko.mClip.y = top.to_i32_au();
|
||||
} else {
|
||||
self.gecko.mClip.y = 0;
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_TOP_AUTO as u8;
|
||||
}
|
||||
self.gecko.mClip.y = match rect.top {
|
||||
LengthPercentage(l) => l.to_i32_au(),
|
||||
Auto => {
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_TOP_AUTO as u8;
|
||||
0
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(bottom) = rect.bottom {
|
||||
self.gecko.mClip.height = (Au::from(bottom) - Au(self.gecko.mClip.y)).0;
|
||||
} else {
|
||||
self.gecko.mClip.height = 1 << 30; // NS_MAXSIZE
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_BOTTOM_AUTO as u8;
|
||||
}
|
||||
self.gecko.mClip.height = match rect.bottom {
|
||||
LengthPercentage(l) => (Au::from(l) - Au(self.gecko.mClip.y)).0,
|
||||
Auto => {
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_BOTTOM_AUTO as u8;
|
||||
1 << 30 // NS_MAXSIZE
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(right) = rect.right {
|
||||
self.gecko.mClip.width = (Au::from(right) - Au(self.gecko.mClip.x)).0;
|
||||
} else {
|
||||
self.gecko.mClip.width = 1 << 30; // NS_MAXSIZE
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_RIGHT_AUTO as u8;
|
||||
}
|
||||
self.gecko.mClip.width = match rect.right {
|
||||
LengthPercentage(l) => (Au::from(l) - Au(self.gecko.mClip.x)).0,
|
||||
Auto => {
|
||||
self.gecko.mClipFlags |= NS_STYLE_CLIP_RIGHT_AUTO as u8;
|
||||
1 << 30 // NS_MAXSIZE
|
||||
}
|
||||
};
|
||||
},
|
||||
Either::Second(_auto) => {
|
||||
self.gecko.mClipFlags = NS_STYLE_CLIP_AUTO as u8;
|
||||
|
@ -3904,42 +3917,42 @@ fn static_assert() {
|
|||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_LEFT_AUTO;
|
||||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_RIGHT_AUTO;
|
||||
use crate::gecko_bindings::structs::NS_STYLE_CLIP_TOP_AUTO;
|
||||
use crate::values::generics::length::LengthPercentageOrAuto::*;
|
||||
use crate::values::computed::{ClipRect, ClipRectOrAuto};
|
||||
use crate::values::Either;
|
||||
|
||||
if self.gecko.mClipFlags == NS_STYLE_CLIP_AUTO as u8 {
|
||||
ClipRectOrAuto::auto()
|
||||
} else {
|
||||
let left = if self.gecko.mClipFlags & NS_STYLE_CLIP_LEFT_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.x, 0);
|
||||
None
|
||||
} else {
|
||||
Some(Au(self.gecko.mClip.x).into())
|
||||
};
|
||||
|
||||
let top = if self.gecko.mClipFlags & NS_STYLE_CLIP_TOP_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.y, 0);
|
||||
None
|
||||
} else {
|
||||
Some(Au(self.gecko.mClip.y).into())
|
||||
};
|
||||
|
||||
let bottom = if self.gecko.mClipFlags & NS_STYLE_CLIP_BOTTOM_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.height, 1 << 30); // NS_MAXSIZE
|
||||
None
|
||||
} else {
|
||||
Some(Au(self.gecko.mClip.y + self.gecko.mClip.height).into())
|
||||
};
|
||||
|
||||
let right = if self.gecko.mClipFlags & NS_STYLE_CLIP_RIGHT_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.width, 1 << 30); // NS_MAXSIZE
|
||||
None
|
||||
} else {
|
||||
Some(Au(self.gecko.mClip.x + self.gecko.mClip.width).into())
|
||||
};
|
||||
|
||||
Either::First(ClipRect { top, right, bottom, left })
|
||||
return ClipRectOrAuto::auto()
|
||||
}
|
||||
let left = if self.gecko.mClipFlags & NS_STYLE_CLIP_LEFT_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.x, 0);
|
||||
Auto
|
||||
} else {
|
||||
LengthPercentage(Au(self.gecko.mClip.x).into())
|
||||
};
|
||||
|
||||
let top = if self.gecko.mClipFlags & NS_STYLE_CLIP_TOP_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.y, 0);
|
||||
Auto
|
||||
} else {
|
||||
LengthPercentage(Au(self.gecko.mClip.y).into())
|
||||
};
|
||||
|
||||
let bottom = if self.gecko.mClipFlags & NS_STYLE_CLIP_BOTTOM_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.height, 1 << 30); // NS_MAXSIZE
|
||||
Auto
|
||||
} else {
|
||||
LengthPercentage(Au(self.gecko.mClip.y + self.gecko.mClip.height).into())
|
||||
};
|
||||
|
||||
let right = if self.gecko.mClipFlags & NS_STYLE_CLIP_RIGHT_AUTO as u8 != 0 {
|
||||
debug_assert_eq!(self.gecko.mClip.width, 1 << 30); // NS_MAXSIZE
|
||||
Auto
|
||||
} else {
|
||||
LengthPercentage(Au(self.gecko.mClip.x + self.gecko.mClip.width).into())
|
||||
};
|
||||
|
||||
Either::First(ClipRect { top, right, bottom, left })
|
||||
}
|
||||
|
||||
<%
|
||||
|
|
|
@ -802,29 +802,29 @@ impl ToAnimatedZero for Visibility {
|
|||
impl Animate for ClipRect {
|
||||
#[inline]
|
||||
fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {
|
||||
use crate::values::computed::Length;
|
||||
let animate_component = |this: &Option<Length>, other: &Option<Length>| {
|
||||
match (this.animate(other, procedure)?, procedure) {
|
||||
(None, Procedure::Interpolate { .. }) => Ok(None),
|
||||
(None, _) => Err(()),
|
||||
(result, _) => Ok(result),
|
||||
use crate::values::computed::LengthOrAuto;
|
||||
let animate_component = |this: &LengthOrAuto, other: &LengthOrAuto| {
|
||||
let result = this.animate(other, procedure)?;
|
||||
if let Procedure::Interpolate { .. } = procedure {
|
||||
return Ok(result);
|
||||
}
|
||||
if result.is_auto() {
|
||||
// FIXME(emilio): Why? A couple SMIL tests fail without this,
|
||||
// but it seems extremely fishy.
|
||||
return Err(());
|
||||
}
|
||||
Ok(result)
|
||||
};
|
||||
|
||||
Ok(ClipRect {
|
||||
top: animate_component(&self.top, &other.top)?,
|
||||
right: animate_component(&self.right, &other.right)?,
|
||||
top: animate_component(&self.top, &other.top)?,
|
||||
right: animate_component(&self.right, &other.right)?,
|
||||
bottom: animate_component(&self.bottom, &other.bottom)?,
|
||||
left: animate_component(&self.left, &other.left)?,
|
||||
left: animate_component(&self.left, &other.left)?,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl ToAnimatedZero for ClipRect {
|
||||
#[inline]
|
||||
fn to_animated_zero(&self) -> Result<Self, ()> { Err(()) }
|
||||
}
|
||||
|
||||
<%
|
||||
FILTER_FUNCTIONS = [ 'Blur', 'Brightness', 'Contrast', 'Grayscale',
|
||||
'HueRotate', 'Invert', 'Opacity', 'Saturate',
|
||||
|
|
|
@ -9,8 +9,8 @@
|
|||
${helpers.predefined_type(
|
||||
"column-width",
|
||||
"length::NonNegativeLengthOrAuto",
|
||||
"Either::Second(Auto)",
|
||||
initial_specified_value="Either::Second(Auto)",
|
||||
"computed::length::NonNegativeLengthOrAuto::auto()",
|
||||
initial_specified_value="specified::length::NonNegativeLengthOrAuto::auto()",
|
||||
extra_prefixes="moz",
|
||||
animation_value_type="NonNegativeLengthOrAuto",
|
||||
servo_pref="layout.columns.enabled",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue