diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/style/properties/gecko.mako.rs | 170 | ||||
-rw-r--r-- | components/style/properties/longhands/list.mako.rs | 1 | ||||
-rw-r--r-- | components/style/values/computed/mod.rs | 21 | ||||
-rw-r--r-- | components/style/values/generics/mod.rs | 40 | ||||
-rw-r--r-- | components/style/values/specified/mod.rs | 14 |
5 files changed, 52 insertions, 194 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 8de2861f263..f751e872f3f 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -2162,7 +2162,7 @@ fn static_assert() { </%self:impl_trait> <%self:impl_trait style_struct_name="List" - skip_longhands="list-style-image list-style-type -moz-image-region"> + skip_longhands="list-style-image list-style-type"> pub fn set_list_style_image(&mut self, image: longhands::list_style_image::computed_value::T) { match image { @@ -2232,178 +2232,12 @@ fn static_assert() { Either::Second(string) => T::String(string), } } - - #[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) => { - self.gecko.mImageRegion.x = 0; - self.gecko.mImageRegion.y = 0; - self.gecko.mImageRegion.width = 0; - self.gecko.mImageRegion.height = 0; - } - Either::First(rect) => { - 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 { - LengthPercentage(value) => (Au::from(value) - Au(self.gecko.mImageRegion.y)).0, - Auto => 0, - }; - self.gecko.mImageRegion.width = match rect.right { - LengthPercentage(value) => (Au::from(value) - Au(self.gecko.mImageRegion.x)).0, - Auto => 0, - }; - } - } - } - - #[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 - // if all components are zero, we use Auto. - if self.gecko.mImageRegion.x == 0 && - self.gecko.mImageRegion.y == 0 && - self.gecko.mImageRegion.width == 0 && - self.gecko.mImageRegion.height == 0 { - return Either::Second(Auto); - } - - Either::First(ClipRect { - 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()), - }) - } - - ${impl_simple_copy('_moz_image_region', 'mImageRegion')} - </%self:impl_trait> <%self:impl_trait style_struct_name="Table"> </%self:impl_trait> -<%self:impl_trait style_struct_name="Effects" skip_longhands="clip"> - pub fn set_clip(&mut self, v: longhands::clip::computed_value::T) { - use crate::gecko_bindings::structs::NS_STYLE_CLIP_AUTO; - use crate::gecko_bindings::structs::NS_STYLE_CLIP_RECT; - use crate::gecko_bindings::structs::NS_STYLE_CLIP_LEFT_AUTO; - 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; - 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 - } - }; - - 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 - } - }; - - 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 - } - }; - - 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; - self.gecko.mClip.x = 0; - self.gecko.mClip.y = 0; - self.gecko.mClip.width = 0; - self.gecko.mClip.height = 0; - } - } - } - - pub fn copy_clip_from(&mut self, other: &Self) { - self.gecko.mClip = other.gecko.mClip; - self.gecko.mClipFlags = other.gecko.mClipFlags; - } - - pub fn reset_clip(&mut self, other: &Self) { - self.copy_clip_from(other) - } - - pub fn clone_clip(&self) -> longhands::clip::computed_value::T { - use crate::gecko_bindings::structs::NS_STYLE_CLIP_AUTO; - use crate::gecko_bindings::structs::NS_STYLE_CLIP_BOTTOM_AUTO; - 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 { - 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 }) - } +<%self:impl_trait style_struct_name="Effects"> </%self:impl_trait> <%self:impl_trait style_struct_name="InheritedBox"> diff --git a/components/style/properties/longhands/list.mako.rs b/components/style/properties/longhands/list.mako.rs index 0de69c952de..202c7839d69 100644 --- a/components/style/properties/longhands/list.mako.rs +++ b/components/style/properties/longhands/list.mako.rs @@ -76,6 +76,7 @@ ${helpers.predefined_type( "ClipRectOrAuto", "computed::ClipRectOrAuto::auto()", engines="gecko", + gecko_ffi_name="mImageRegion", animation_value_type="ComputedValue", boxed=True, spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/-moz-image-region)", diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index a565fc5f93b..aafb42b284a 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -683,11 +683,11 @@ impl From<CSSInteger> for PositiveInteger { /// A computed positive `<integer>` value or `none`. pub type PositiveIntegerOrNone = Either<PositiveInteger, None_>; -/// rect(...) -pub type ClipRect = generics::ClipRect<LengthOrAuto>; +/// rect(...) | auto +pub type ClipRect = generics::GenericClipRect<LengthOrAuto>; /// rect(...) | auto -pub type ClipRectOrAuto = Either<ClipRect, Auto>; +pub type ClipRectOrAuto = generics::GenericClipRectOrAuto<ClipRect>; /// The computed value of a grid `<track-breadth>` pub type TrackBreadth = GenericTrackBreadth<LengthPercentage>; @@ -707,18 +707,3 @@ pub type GridLine = GenericGridLine<Integer>; /// `<grid-template-rows> | <grid-template-columns>` pub type GridTemplateComponent = GenericGridTemplateComponent<LengthPercentage, Integer>; - -impl ClipRectOrAuto { - /// Return an auto (default for clip-rect and image-region) value - pub fn auto() -> Self { - Either::Second(Auto) - } - - /// Check if it is auto - pub fn is_auto(&self) -> bool { - match *self { - Either::Second(_) => true, - _ => false, - } - } -} diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs index 343aad87694..3bc564dd385 100644 --- a/components/style/values/generics/mod.rs +++ b/components/style/values/generics/mod.rs @@ -272,9 +272,47 @@ pub struct ZeroToOne<T>(pub T); ToShmem, )] #[css(function = "rect", comma)] -pub struct ClipRect<LengthOrAuto> { +#[repr(C)] +pub struct GenericClipRect<LengthOrAuto> { pub top: LengthOrAuto, pub right: LengthOrAuto, pub bottom: LengthOrAuto, pub left: LengthOrAuto, } + +pub use self::GenericClipRect as ClipRect; + +/// Either a clip-rect or `auto`. +#[allow(missing_docs)] +#[derive( + Animate, + Clone, + ComputeSquaredDistance, + Copy, + Debug, + MallocSizeOf, + Parse, + PartialEq, + SpecifiedValueInfo, + ToAnimatedValue, + ToAnimatedZero, + ToComputedValue, + ToCss, + ToResolvedValue, + ToShmem, +)] +#[repr(C, u8)] +pub enum GenericClipRectOrAuto<R> { + Auto, + Rect(R), +} + +pub use self::GenericClipRectOrAuto as ClipRectOrAuto; + +impl<L> ClipRectOrAuto<L> { + /// Returns the `auto` value. + #[inline] + pub fn auto() -> Self { + ClipRectOrAuto::Auto + } +} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index ddb890ba395..bb10a7e540c 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -13,7 +13,7 @@ use super::generics::grid::{GridLine as GenericGridLine, TrackBreadth as Generic use super::generics::grid::{TrackList as GenericTrackList, TrackSize as GenericTrackSize}; use super::generics::transform::IsParallelTo; use super::generics::{self, GreaterThanOrEqualToOne, NonNegative}; -use super::{Auto, CSSFloat, CSSInteger, Either, None_}; +use super::{CSSFloat, CSSInteger, Either, None_}; use crate::context::QuirksMode; use crate::parser::{Parse, ParserContext}; use crate::values::serialize_atom_identifier; @@ -639,7 +639,7 @@ pub type GridLine = GenericGridLine<Integer>; pub type GridTemplateComponent = GenericGridTemplateComponent<LengthPercentage, Integer>; /// rect(...) -pub type ClipRect = generics::ClipRect<LengthOrAuto>; +pub type ClipRect = generics::GenericClipRect<LengthOrAuto>; impl Parse for ClipRect { fn parse<'i, 't>( @@ -652,7 +652,7 @@ impl Parse for ClipRect { impl ClipRect { /// Parses a rect(<top>, <left>, <bottom>, <right>), allowing quirks. - pub fn parse_quirky<'i, 't>( + fn parse_quirky<'i, 't>( context: &ParserContext, input: &mut Parser<'i, 't>, allow_quirks: AllowQuirks, @@ -696,7 +696,7 @@ impl ClipRect { } /// rect(...) | auto -pub type ClipRectOrAuto = Either<ClipRect, Auto>; +pub type ClipRectOrAuto = generics::GenericClipRectOrAuto<ClipRect>; impl ClipRectOrAuto { /// Parses a ClipRect or Auto, allowing quirks. @@ -706,10 +706,10 @@ impl ClipRectOrAuto { allow_quirks: AllowQuirks, ) -> Result<Self, ParseError<'i>> { if let Ok(v) = input.try(|i| ClipRect::parse_quirky(context, i, allow_quirks)) { - Ok(Either::First(v)) - } else { - Auto::parse(context, input).map(Either::Second) + return Ok(generics::GenericClipRectOrAuto::Rect(v)) } + input.expect_ident_matching("auto")?; + Ok(generics::GenericClipRectOrAuto::Auto) } } |