diff --git a/components/style/gecko/conversions.rs b/components/style/gecko/conversions.rs index 3deaeacadc8..5390d904d02 100644 --- a/components/style/gecko/conversions.rs +++ b/components/style/gecko/conversions.rs @@ -23,6 +23,9 @@ impl nsStyleImage { /// Set a given Servo `Image` value into this `nsStyleImage`. pub fn set(&mut self, image: Image) { match image { + GenericImage::None => unsafe { + bindings::Gecko_SetNullImageValue(self); + }, GenericImage::Gradient(boxed_gradient) => self.set_gradient(boxed_gradient), GenericImage::Url(ref url) => unsafe { bindings::Gecko_SetLayerImageImageValue(self, url); @@ -55,35 +58,35 @@ impl nsStyleImage { } /// Converts into Image. - pub unsafe fn into_image(self: &nsStyleImage) -> Option { + pub unsafe fn to_image(&self) -> Image { use crate::gecko_bindings::structs::nsStyleImageType; use crate::values::computed::MozImageRect; match self.mType { - nsStyleImageType::eStyleImageType_Null => None, + nsStyleImageType::eStyleImageType_Null => GenericImage::None, nsStyleImageType::eStyleImageType_Image => { let url = self.__bindgen_anon_1.mImage.as_ref().clone(); if self.mCropRect.mPtr.is_null() { - Some(GenericImage::Url(url)) + GenericImage::Url(url) } else { let rect = &*self.mCropRect.mPtr; - Some(GenericImage::Rect(Box::new(MozImageRect { + GenericImage::Rect(Box::new(MozImageRect { url, top: rect.0, right: rect.1, bottom: rect.2, left: rect.3, - }))) + })) } }, nsStyleImageType::eStyleImageType_Gradient => { let gradient: &Gradient = &**self.__bindgen_anon_1.mGradient.as_ref(); - Some(GenericImage::Gradient(Box::new(gradient.clone()))) + GenericImage::Gradient(Box::new(gradient.clone())) }, nsStyleImageType::eStyleImageType_Element => { use crate::gecko_string_cache::Atom; let atom = bindings::Gecko_GetImageElement(self); - Some(GenericImage::Element(Atom::from_raw(atom))) + GenericImage::Element(Atom::from_raw(atom)) }, } } @@ -102,7 +105,7 @@ pub mod basic_shape { impl StyleShapeSource { /// Convert StyleShapeSource to ShapeSource except URL and Image /// types. - fn into_shape_source( + fn to_shape_source( &self, ) -> Option> where @@ -149,14 +152,14 @@ pub mod basic_shape { use crate::values::generics::image::Image as GenericImage; let shape_image = &*other.__bindgen_anon_1.mShapeImage.as_ref().mPtr; - let image = shape_image.into_image().expect("Cannot convert to Image"); + let image = shape_image.to_image(); match image { GenericImage::Url(url) => ShapeSource::ImageOrUrl(url.0), _ => panic!("ClippingShape doesn't support non-url images"), } }, _ => other - .into_shape_source() + .to_shape_source() .expect("Couldn't convert to StyleSource!"), } } @@ -167,11 +170,11 @@ pub mod basic_shape { match other.mType { StyleShapeSourceType::Image => unsafe { let shape_image = &*other.__bindgen_anon_1.mShapeImage.as_ref().mPtr; - let image = shape_image.into_image().expect("Cannot convert to Image"); + let image = shape_image.to_image(); ShapeSource::ImageOrUrl(image) }, _ => other - .into_shape_source() + .to_shape_source() .expect("Couldn't convert to StyleSource!"), } } diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 6cfb4c859b4..e6cd75e2ee0 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -47,7 +47,6 @@ use crate::values::computed::url::ComputedImageUrl; use crate::values::computed::BorderStyle; use crate::values::computed::font::FontSize; use crate::values::generics::column::ColumnCount; -use crate::values::generics::image::ImageLayer; pub mod style_structs { @@ -849,14 +848,7 @@ fn static_assert() { % endfor pub fn set_border_image_source(&mut self, image: longhands::border_image_source::computed_value::T) { - unsafe { - // Prevent leaking of the last elements we did set - Gecko_SetNullImageValue(&mut self.gecko.mBorderImageSource); - } - - if let ImageLayer::Image(image) = image { - self.gecko.mBorderImageSource.set(image); - } + self.gecko.mBorderImageSource.set(image); } pub fn copy_border_image_source_from(&mut self, other: &Self) { @@ -871,10 +863,7 @@ fn static_assert() { } pub fn clone_border_image_source(&self) -> longhands::border_image_source::computed_value::T { - match unsafe { self.gecko.mBorderImageSource.into_image() } { - Some(image) => ImageLayer::Image(image), - None => ImageLayer::None, - } + unsafe { self.gecko.mBorderImageSource.to_image() } } <% @@ -2042,9 +2031,7 @@ fn static_assert() { for (image, geckoimage) in images.zip(self.gecko.${image_layers_field} .mLayers.iter_mut()) { - if let ImageLayer::Image(image) = image { - geckoimage.mImage.set(image) - } + geckoimage.mImage.set(image) } } @@ -2052,12 +2039,8 @@ fn static_assert() { longhands::${shorthand}_image::computed_value::List( self.gecko.${image_layers_field}.mLayers.iter() .take(self.gecko.${image_layers_field}.mImageCount as usize) - .map(|ref layer| { - match unsafe { layer.mImage.into_image() } { - Some(image) => ImageLayer::Image(image), - None => ImageLayer::None, - } - }).collect() + .map(|layer| unsafe { layer.mImage.to_image() }) + .collect() ) } diff --git a/components/style/properties/longhands/background.mako.rs b/components/style/properties/longhands/background.mako.rs index e0ef021f32d..a0b026c592e 100644 --- a/components/style/properties/longhands/background.mako.rs +++ b/components/style/properties/longhands/background.mako.rs @@ -21,10 +21,10 @@ ${helpers.predefined_type( ${helpers.predefined_type( "background-image", - "ImageLayer", + "Image", engines="gecko servo-2013 servo-2020", - initial_value="computed::ImageLayer::none()", - initial_specified_value="specified::ImageLayer::none()", + initial_value="computed::Image::None", + initial_specified_value="specified::Image::None", spec="https://drafts.csswg.org/css-backgrounds/#the-background-image", vector="True", animation_value_type="discrete", diff --git a/components/style/properties/longhands/border.mako.rs b/components/style/properties/longhands/border.mako.rs index f281fa1a30d..1c4eae16939 100644 --- a/components/style/properties/longhands/border.mako.rs +++ b/components/style/properties/longhands/border.mako.rs @@ -106,10 +106,10 @@ ${helpers.single_keyword( ${helpers.predefined_type( "border-image-source", - "ImageLayer", + "Image", engines="gecko servo-2013 servo-2020", - initial_value="computed::ImageLayer::none()", - initial_specified_value="specified::ImageLayer::none()", + initial_value="computed::Image::None", + initial_specified_value="specified::Image::None", spec="https://drafts.csswg.org/css-backgrounds/#the-background-image", vector=False, animation_value_type="discrete", diff --git a/components/style/properties/longhands/svg.mako.rs b/components/style/properties/longhands/svg.mako.rs index 724c38b2d1b..3b992ba3f5a 100644 --- a/components/style/properties/longhands/svg.mako.rs +++ b/components/style/properties/longhands/svg.mako.rs @@ -172,10 +172,10 @@ ${helpers.single_keyword( ${helpers.predefined_type( "mask-image", - "ImageLayer", + "Image", engines="gecko", - initial_value="computed::ImageLayer::none()", - initial_specified_value="specified::ImageLayer::none()", + initial_value="computed::Image::None", + initial_specified_value="specified::Image::None", parse_method="parse_with_cors_anonymous", spec="https://drafts.fxtf.org/css-masking/#propdef-mask-image", vector=True, diff --git a/components/style/traversal.rs b/components/style/traversal.rs index a6aa220ccfa..3811597084b 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -684,7 +684,7 @@ fn notify_paint_worklet(context: &StyleContext, data: &ElementData) where E: TElement, { - use crate::values::generics::image::{GenericImageLayer, Image}; + use crate::values::generics::image::Image; use style_traits::ToCss; // We speculatively evaluate any paint worklets during styling. @@ -694,7 +694,7 @@ where if let Some(ref values) = data.styles.primary { for image in &values.get_background().background_image.0 { let (name, arguments) = match *image { - GenericImageLayer::Image(Image::PaintWorklet(ref worklet)) => { + Image::PaintWorklet(ref worklet) => { (&worklet.name, &worklet.arguments) }, _ => continue, diff --git a/components/style/values/computed/image.rs b/components/style/values/computed/image.rs index bd59acac547..8610888bef7 100644 --- a/components/style/values/computed/image.rs +++ b/components/style/values/computed/image.rs @@ -22,9 +22,6 @@ use std::f32::consts::PI; use std::fmt::{self, Write}; use style_traits::{CssWriter, ToCss}; -/// A computed image layer. -pub type ImageLayer = generic::GenericImageLayer; - /// Computed values for an image according to CSS-IMAGES. /// pub type Image = generic::GenericImage; @@ -65,7 +62,7 @@ pub type ColorStop = generic::ColorStop; /// Computed values for `-moz-image-rect(...)`. #[cfg(feature = "gecko")] -pub type MozImageRect = generic::MozImageRect; +pub type MozImageRect = generic::GenericMozImageRect; /// Empty enum on non-gecko #[cfg(not(feature = "gecko"))] diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 7cfd1e20abe..c1c83f829a8 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -57,7 +57,7 @@ pub use self::font::{FontSize, FontSizeAdjust, FontStretch, FontSynthesis}; pub use self::font::{FontVariantAlternates, FontWeight}; pub use self::font::{FontVariantEastAsian, FontVariationSettings}; pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XLang, XTextZoom}; -pub use self::image::{Gradient, GradientItem, Image, ImageLayer, LineDirection, MozImageRect}; +pub use self::image::{Gradient, GradientItem, Image, LineDirection, MozImageRect}; pub use self::length::{CSSPixelLength, ExtremumLength, NonNegativeLength}; pub use self::length::{Length, LengthOrNumber, LengthPercentage, NonNegativeLengthOrNumber}; pub use self::length::{LengthOrAuto, LengthPercentageOrAuto, MaxSize, Size}; diff --git a/components/style/values/generics/image.rs b/components/style/values/generics/image.rs index a6b45bc82ad..4b79dcb9cb8 100644 --- a/components/style/values/generics/image.rs +++ b/components/style/values/generics/image.rs @@ -13,51 +13,22 @@ use servo_arc::Arc; use std::fmt::{self, Write}; use style_traits::{CssWriter, ToCss}; -/// An | (for background-image, for example). -#[derive( - Clone, - Debug, - MallocSizeOf, - Parse, - PartialEq, - SpecifiedValueInfo, - ToComputedValue, - ToCss, - ToResolvedValue, - ToShmem, -)] -pub enum GenericImageLayer { - /// The `none` value. - None, - /// The `` value. - Image(Image), -} - -pub use self::GenericImageLayer as ImageLayer; - -impl ImageLayer { - /// Returns `none`. - #[inline] - pub fn none() -> Self { - ImageLayer::None - } -} - -/// An [image]. +/// An ` | none` value. /// -/// [image]: https://drafts.csswg.org/css-images/#image-values +/// https://drafts.csswg.org/css-images/#image-values #[derive( Clone, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToComputedValue, ToResolvedValue, ToShmem, )] #[repr(C, u8)] -pub enum GenericImage { +pub enum GenericImage { + /// `none` variant. + None, /// A `` image. Url(ImageUrl), /// A `` image. Gradients are rather large, and not nearly as /// common as urls, so we box them here to keep the size of this enum sane. - Gradient(Box), - + Gradient(Box), /// A `-moz-image-rect` image. Also fairly large and rare. // not cfg’ed out on non-Gecko to avoid `error[E0392]: parameter `MozImageRect` is never used` // Instead we make MozImageRect an empty enum @@ -285,7 +256,7 @@ impl ToCss for PaintWorklet { /// /// `-moz-image-rect(, top, right, bottom, left);` #[allow(missing_docs)] -#[css(comma, function)] +#[css(comma, function = "-moz-image-rect")] #[derive( Clone, Debug, @@ -297,7 +268,8 @@ impl ToCss for PaintWorklet { ToResolvedValue, ToShmem, )] -pub struct MozImageRect { +#[repr(C)] +pub struct GenericMozImageRect { pub url: MozImageRectUrl, pub top: NumberOrPercentage, pub right: NumberOrPercentage, @@ -305,6 +277,8 @@ pub struct MozImageRect { pub left: NumberOrPercentage, } +pub use self::GenericMozImageRect as MozImageRect; + impl fmt::Debug for Image where G: ToCss, @@ -327,6 +301,7 @@ where W: Write, { match *self { + Image::None => dest.write_str("none"), Image::Url(ref url) => url.to_css(dest), Image::Gradient(ref gradient) => gradient.to_css(dest), Image::Rect(ref rect) => rect.to_css(dest), diff --git a/components/style/values/specified/basic_shape.rs b/components/style/values/specified/basic_shape.rs index 3c32144e71c..68938b4e6dd 100644 --- a/components/style/values/specified/basic_shape.rs +++ b/components/style/values/specified/basic_shape.rs @@ -71,6 +71,10 @@ impl Parse for ClippingShape { context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { + if input.try(|i| i.expect_ident_matching("none")).is_ok() { + return Ok(ShapeSource::None); + } + if is_clip_path_path_enabled(context) { if let Ok(p) = input.try(|i| Path::parse(context, i)) { return Ok(ShapeSource::Path(p)); @@ -91,7 +95,14 @@ impl Parse for FloatAreaShape { context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { + // Need to parse this here so that `Image::parse_with_cors_anonymous` + // doesn't parse it. + if input.try(|i| i.expect_ident_matching("none")).is_ok() { + return Ok(ShapeSource::None); + } + if let Ok(image) = input.try(|i| Image::parse_with_cors_anonymous(context, i)) { + debug_assert_ne!(image, Image::None); return Ok(ShapeSource::ImageOrUrl(image)); } @@ -108,10 +119,6 @@ where context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { - if input.try(|i| i.expect_ident_matching("none")).is_ok() { - return Ok(ShapeSource::None); - } - fn parse_component( context: &ParserContext, input: &mut Parser, diff --git a/components/style/values/specified/image.rs b/components/style/values/specified/image.rs index 14a2a9ad9c8..369b1936f87 100644 --- a/components/style/values/specified/image.rs +++ b/components/style/values/specified/image.rs @@ -32,24 +32,6 @@ use std::fmt::{self, Write}; use style_traits::{CssType, CssWriter, KeywordsCollectFn, ParseError}; use style_traits::{SpecifiedValueInfo, StyleParseErrorKind, ToCss}; -/// A specified image layer. -pub type ImageLayer = generic::GenericImageLayer; - -impl ImageLayer { - /// This is a specialization of Either with an alternative parse - /// method to provide anonymous CORS headers for the Image url fetch. - pub fn parse_with_cors_anonymous<'i, 't>( - context: &ParserContext, - input: &mut Parser<'i, 't>, - ) -> Result> { - if let Ok(v) = input.try(|i| Image::parse_with_cors_anonymous(context, i)) { - return Ok(generic::GenericImageLayer::Image(v)); - } - input.expect_ident_matching("none")?; - Ok(generic::GenericImageLayer::None) - } -} - /// Specified values for an image according to CSS-IMAGES. /// pub type Image = generic::Image; @@ -118,8 +100,8 @@ pub type ColorStop = generic::ColorStop; /// Specified values for `moz-image-rect` /// -moz-image-rect(, top, right, bottom, left); -#[cfg(feature = "gecko")] -pub type MozImageRect = generic::MozImageRect; +#[cfg(all(feature = "gecko", not(feature = "cbindgen")))] +pub type MozImageRect = generic::GenericMozImageRect; #[cfg(not(feature = "gecko"))] #[derive( @@ -141,6 +123,9 @@ impl Parse for Image { context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result> { + if input.try(|i| i.expect_ident_matching("none")).is_ok() { + return Ok(generic::Image::None); + } if let Ok(url) = input.try(|input| SpecifiedImageUrl::parse(context, input)) { return Ok(generic::Image::Url(url)); } diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 54401045809..d45643d6604 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -56,7 +56,7 @@ pub use self::font::{FontVariantAlternates, FontWeight}; pub use self::font::{FontVariantEastAsian, FontVariationSettings}; pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XLang, XTextZoom}; pub use self::image::{ColorStop, EndingShape as GradientEndingShape, Gradient}; -pub use self::image::{GradientItem, GradientKind, Image, ImageLayer, MozImageRect}; +pub use self::image::{GradientItem, GradientKind, Image, MozImageRect}; pub use self::length::{AbsoluteLength, CalcLengthPercentage, CharacterWidth}; pub use self::length::{FontRelativeLength, Length, LengthOrNumber, NonNegativeLengthOrNumber}; pub use self::length::{LengthOrAuto, LengthPercentage, LengthPercentageOrAuto};