diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 7bf55802022..6838114d3b1 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -523,110 +523,6 @@ def set_gecko_property(ffi_name, expr): } -<%def name="impl_svg_paint(ident, gecko_ffi_name)"> - #[allow(non_snake_case)] - pub fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) { - use crate::values::generics::svg::{SVGPaintKind, SVGPaintFallback}; - use self::structs::nsStyleSVGPaintType; - use self::structs::nsStyleSVGFallbackType; - - let ref mut paint = ${get_gecko_property(gecko_ffi_name)}; - unsafe { - bindings::Gecko_nsStyleSVGPaint_Reset(paint); - } - match v.kind { - SVGPaintKind::None => return, - SVGPaintKind::ContextFill => { - paint.mType = nsStyleSVGPaintType::eStyleSVGPaintType_ContextFill; - } - SVGPaintKind::ContextStroke => { - paint.mType = nsStyleSVGPaintType::eStyleSVGPaintType_ContextStroke; - } - SVGPaintKind::PaintServer(url) => { - unsafe { - bindings::Gecko_nsStyleSVGPaint_SetURLValue( - paint, - &url - ) - } - } - SVGPaintKind::Color(color) => { - paint.mType = nsStyleSVGPaintType::eStyleSVGPaintType_Color; - unsafe { - *paint.mPaint.mColor.as_mut() = color.into(); - } - } - } - - paint.mFallbackType = match v.fallback { - SVGPaintFallback::Color(c) => { - paint.mFallbackColor = c.into(); - nsStyleSVGFallbackType::eStyleSVGFallbackType_Color - }, - SVGPaintFallback::None => { - nsStyleSVGFallbackType::eStyleSVGFallbackType_None - }, - SVGPaintFallback::Unset => { - nsStyleSVGFallbackType::eStyleSVGFallbackType_NotSet - } - }; - } - - #[allow(non_snake_case)] - pub fn copy_${ident}_from(&mut self, other: &Self) { - unsafe { - bindings::Gecko_nsStyleSVGPaint_CopyFrom( - &mut ${get_gecko_property(gecko_ffi_name)}, - & ${get_gecko_property(gecko_ffi_name, "other")} - ); - } - } - - #[allow(non_snake_case)] - pub fn reset_${ident}(&mut self, other: &Self) { - self.copy_${ident}_from(other) - } - - #[allow(non_snake_case)] - pub fn clone_${ident}(&self) -> longhands::${ident}::computed_value::T { - use crate::values::generics::svg::{SVGPaint, SVGPaintKind, SVGPaintFallback}; - use self::structs::nsStyleSVGPaintType; - use self::structs::nsStyleSVGFallbackType; - let ref paint = ${get_gecko_property(gecko_ffi_name)}; - - let fallback = match paint.mFallbackType { - nsStyleSVGFallbackType::eStyleSVGFallbackType_Color => { - SVGPaintFallback::Color(paint.mFallbackColor.into()) - }, - nsStyleSVGFallbackType::eStyleSVGFallbackType_None => { - SVGPaintFallback::None - }, - nsStyleSVGFallbackType::eStyleSVGFallbackType_NotSet => { - SVGPaintFallback::Unset - } - }; - - let kind = match paint.mType { - nsStyleSVGPaintType::eStyleSVGPaintType_None => SVGPaintKind::None, - nsStyleSVGPaintType::eStyleSVGPaintType_ContextFill => SVGPaintKind::ContextFill, - nsStyleSVGPaintType::eStyleSVGPaintType_ContextStroke => SVGPaintKind::ContextStroke, - nsStyleSVGPaintType::eStyleSVGPaintType_Server => { - SVGPaintKind::PaintServer(unsafe { - paint.mPaint.mPaintServer.as_ref().clone() - }) - } - nsStyleSVGPaintType::eStyleSVGPaintType_Color => { - let col = unsafe { *paint.mPaint.mColor.as_ref() }; - SVGPaintKind::Color(col.into()) - } - }; - SVGPaint { - kind: kind, - fallback: fallback, - } - } - - <%def name="impl_non_negative_length(ident, gecko_ffi_name, inherit_from=None, round_to_pixels=False)"> #[allow(non_snake_case)] @@ -836,7 +732,6 @@ impl Clone for ${style_struct.gecko_struct_name} { "MozScriptMinSize": impl_absolute_length, "SVGLength": impl_svg_length, "SVGOpacity": impl_svg_opacity, - "SVGPaint": impl_svg_paint, "SVGWidth": impl_svg_length, } diff --git a/components/style/values/computed/svg.rs b/components/style/values/computed/svg.rs index dafc0d5c3e3..593e5d50a2f 100644 --- a/components/style/values/computed/svg.rs +++ b/components/style/values/computed/svg.rs @@ -11,14 +11,13 @@ use crate::values::generics::svg as generic; use crate::values::RGBA; use crate::Zero; -pub use crate::values::specified::SVGPaintOrder; - -pub use crate::values::specified::MozContextProperties; +pub use crate::values::specified::{SVGPaintOrder, MozContextProperties}; /// Computed SVG Paint value -pub type SVGPaint = generic::SVGPaint; +pub type SVGPaint = generic::GenericSVGPaint; + /// Computed SVG Paint Kind value -pub type SVGPaintKind = generic::SVGPaintKind; +pub type SVGPaintKind = generic::GenericSVGPaintKind; impl SVGPaint { /// Opaque black color diff --git a/components/style/values/generics/svg.rs b/components/style/values/generics/svg.rs index 13ef539f6f1..285c309f3b4 100644 --- a/components/style/values/generics/svg.rs +++ b/components/style/values/generics/svg.rs @@ -9,6 +9,7 @@ use cssparser::Parser; use style_traits::ParseError; /// The fallback of an SVG paint server value. +/// cbindgen:derive-tagged-enum-copy-constructor=true #[derive( Animate, Clone, @@ -25,7 +26,8 @@ use style_traits::ParseError; ToResolvedValue, ToShmem, )] -pub enum SVGPaintFallback { +#[repr(C, u8)] +pub enum GenericSVGPaintFallback { /// The `none` keyword. None, /// A magic value that represents no fallback specified and serializes to @@ -36,10 +38,14 @@ pub enum SVGPaintFallback { Color(C), } +pub use self::GenericSVGPaintFallback as SVGPaintFallback; + /// An SVG paint value /// /// -#[animation(no_bound(UrlPaintServer))] +/// +/// cbindgen:derive-tagged-enum-copy-constructor=true +#[animation(no_bound(Url))] #[derive( Animate, Clone, @@ -55,13 +61,16 @@ pub enum SVGPaintFallback { ToResolvedValue, ToShmem, )] -pub struct SVGPaint { +#[repr(C)] +pub struct GenericSVGPaint { /// The paint source. - pub kind: SVGPaintKind, + pub kind: GenericSVGPaintKind, /// The fallback color. - pub fallback: SVGPaintFallback, + pub fallback: GenericSVGPaintFallback, } +pub use self::GenericSVGPaint as SVGPaint; + impl Default for SVGPaint { fn default() -> Self { Self { @@ -71,12 +80,13 @@ impl Default for SVGPaint { } } -/// An SVG paint value without the fallback +/// An SVG paint value without the fallback. /// -/// Whereas the spec only allows PaintServer -/// to have a fallback, Gecko lets the context -/// properties have a fallback as well. -#[animation(no_bound(UrlPaintServer))] +/// Whereas the spec only allows PaintServer to have a fallback, Gecko lets the +/// context properties have a fallback as well. +/// +/// cbindgen:derive-tagged-enum-copy-constructor=true +#[animation(no_bound(U))] #[derive( Animate, Clone, @@ -93,22 +103,25 @@ impl Default for SVGPaint { ToResolvedValue, ToShmem, )] -pub enum SVGPaintKind { +#[repr(C, u8)] +pub enum GenericSVGPaintKind { /// `none` #[animation(error)] None, /// `` - Color(ColorType), + Color(C), /// `url(...)` #[animation(error)] - PaintServer(UrlPaintServer), + PaintServer(U), /// `context-fill` ContextFill, /// `context-stroke` ContextStroke, } -impl Parse for SVGPaint { +pub use self::GenericSVGPaintKind as SVGPaintKind; + +impl Parse for SVGPaint { fn parse<'i, 't>( context: &ParserContext, input: &mut Parser<'i, 't>, diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 5f9fec9a4f0..14439d2eea0 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -74,7 +74,7 @@ pub use self::position::{PositionComponent, ZIndex}; pub use self::rect::NonNegativeLengthOrNumberRect; pub use self::resolution::Resolution; pub use self::svg::MozContextProperties; -pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind}; +pub use self::svg::{SVGLength, SVGOpacity, SVGPaint}; pub use self::svg::{SVGPaintOrder, SVGStrokeDashArray, SVGWidth}; pub use self::svg_path::SVGPathData; pub use self::table::XSpan; diff --git a/components/style/values/specified/svg.rs b/components/style/values/specified/svg.rs index c6fb40ba0c0..9279707935f 100644 --- a/components/style/values/specified/svg.rs +++ b/components/style/values/specified/svg.rs @@ -18,10 +18,7 @@ use style_traits::{CommaWithSpace, CssWriter, ParseError, Separator}; use style_traits::{StyleParseErrorKind, ToCss}; /// Specified SVG Paint value -pub type SVGPaint = generic::SVGPaint; - -/// Specified SVG Paint Kind value -pub type SVGPaintKind = generic::SVGPaintKind; +pub type SVGPaint = generic::GenericSVGPaint; /// | | | context-value pub type SVGLength = generic::SVGLength;