diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2019-05-09 11:24:57 +0000 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2019-05-10 12:43:03 +0200 |
commit | 559235edadc415b750c75ee4fd2d3d7afadf90bb (patch) | |
tree | 33bfc7f8ecfc4f702a1fea94a9b590c34441a33c /components/style | |
parent | 330bccd6595007b62a6b0f8629b717a0c6ac30bf (diff) | |
download | servo-559235edadc415b750c75ee4fd2d3d7afadf90bb.tar.gz servo-559235edadc415b750c75ee4fd2d3d7afadf90bb.zip |
style: Use the owned slice type for basic shape polygon coordinates.
This enables destructors for tagged unions in cbindgen, implemented in:
* https://github.com/eqrion/cbindgen/pull/333
Which allow us to properly generate a destructor for the cbindgen-generated
StyleBasicShape (which now contains an OwnedSlice).
For now, we still use the glue code to go from Box<BasicShape> to
UniquePtr<BasicShape>. But that will change in the future when we generate even
more stuff and remove all the glue.
I could add support for copy-constructor generation to cbindgen for tagged
enums, but I'm not sure if it'll end up being needed, and copy-constructing
unions in C++ is always very tricky.
Differential Revision: https://phabricator.services.mozilla.com/D29769
Diffstat (limited to 'components/style')
-rw-r--r-- | components/style/gecko/conversions.rs | 78 | ||||
-rw-r--r-- | components/style/gecko/values.rs | 33 | ||||
-rw-r--r-- | components/style/owned_slice.rs | 3 | ||||
-rw-r--r-- | components/style/properties/gecko.mako.rs | 83 | ||||
-rw-r--r-- | components/style/properties/longhands/svg.mako.rs | 2 | ||||
-rw-r--r-- | components/style/values/animated/mod.rs | 31 | ||||
-rw-r--r-- | components/style/values/computed/basic_shape.rs | 4 | ||||
-rw-r--r-- | components/style/values/generics/basic_shape.rs | 46 | ||||
-rw-r--r-- | components/style/values/specified/basic_shape.rs | 17 |
9 files changed, 79 insertions, 218 deletions
diff --git a/components/style/gecko/conversions.rs b/components/style/gecko/conversions.rs index 4cd5722bdb0..748396630fb 100644 --- a/components/style/gecko/conversions.rs +++ b/components/style/gecko/conversions.rs @@ -532,28 +532,17 @@ impl nsStyleImage { pub mod basic_shape { //! Conversions from and to CSS shape representations. - - use crate::gecko::values::GeckoStyleCoordConvertible; - use crate::gecko_bindings::structs::nsStyleCoord; - use crate::gecko_bindings::structs::{StyleBasicShape, StyleBasicShapeType}; use crate::gecko_bindings::structs::{ StyleGeometryBox, StyleShapeSource, StyleShapeSourceType, }; use crate::gecko_bindings::sugar::refptr::RefPtr; use crate::values::computed::basic_shape::{ - BasicShape, ClippingShape, FloatAreaShape, ShapeRadius, + BasicShape, ClippingShape, FloatAreaShape, }; - use crate::values::computed::length::LengthPercentage; use crate::values::computed::motion::OffsetPath; use crate::values::computed::url::ComputedUrl; - use crate::values::generics::basic_shape::{ - BasicShape as GenericBasicShape, InsetRect, Polygon, - }; - use crate::values::generics::basic_shape::{Circle, Ellipse, Path, PolygonCoord}; - use crate::values::generics::basic_shape::{GeometryBox, ShapeBox, ShapeSource}; - use crate::values::generics::rect::Rect; + use crate::values::generics::basic_shape::{Path, GeometryBox, ShapeBox, ShapeSource}; use crate::values::specified::SVGPathData; - use std::borrow::Borrow; impl StyleShapeSource { /// Convert StyleShapeSource to ShapeSource except URL and Image @@ -569,7 +558,7 @@ pub mod basic_shape { StyleShapeSourceType::Box => Some(ShapeSource::Box(self.mReferenceBox.into())), StyleShapeSourceType::Shape => { let other_shape = unsafe { &*self.__bindgen_anon_1.mBasicShape.as_ref().mPtr }; - let shape = other_shape.into(); + let shape = Box::new(other_shape.clone()); let reference_box = if self.mReferenceBox == StyleGeometryBox::NoBox { None } else { @@ -653,67 +642,6 @@ pub mod basic_shape { } } - impl<'a> From<&'a StyleBasicShape> for BasicShape { - fn from(other: &'a StyleBasicShape) -> Self { - match other.mType { - StyleBasicShapeType::Inset => { - let t = LengthPercentage::from_gecko_style_coord(&other.mCoordinates[0]); - let r = LengthPercentage::from_gecko_style_coord(&other.mCoordinates[1]); - let b = LengthPercentage::from_gecko_style_coord(&other.mCoordinates[2]); - let l = LengthPercentage::from_gecko_style_coord(&other.mCoordinates[3]); - let round = other.mRadius; - let rect = Rect::new( - t.expect("inset() offset should be a length, percentage, or calc value"), - r.expect("inset() offset should be a length, percentage, or calc value"), - b.expect("inset() offset should be a length, percentage, or calc value"), - l.expect("inset() offset should be a length, percentage, or calc value"), - ); - GenericBasicShape::Inset(InsetRect { rect, round }) - }, - StyleBasicShapeType::Circle => GenericBasicShape::Circle(Circle { - radius: (&other.mCoordinates[0]).into(), - position: other.mPosition, - }), - StyleBasicShapeType::Ellipse => GenericBasicShape::Ellipse(Ellipse { - semiaxis_x: (&other.mCoordinates[0]).into(), - semiaxis_y: (&other.mCoordinates[1]).into(), - position: other.mPosition, - }), - StyleBasicShapeType::Polygon => { - let mut coords = Vec::with_capacity(other.mCoordinates.len() / 2); - for i in 0..(other.mCoordinates.len() / 2) { - let x = 2 * i; - let y = x + 1; - coords.push(PolygonCoord( - LengthPercentage::from_gecko_style_coord(&other.mCoordinates[x]) - .expect( - "polygon() coordinate should be a length, percentage, \ - or calc value", - ), - LengthPercentage::from_gecko_style_coord(&other.mCoordinates[y]) - .expect( - "polygon() coordinate should be a length, percentage, \ - or calc value", - ), - )) - } - GenericBasicShape::Polygon(Polygon { - fill: other.mFillRule, - coordinates: coords, - }) - }, - } - } - } - - impl<'a> From<&'a nsStyleCoord> for ShapeRadius { - fn from(other: &'a nsStyleCoord) -> Self { - let other = other.borrow(); - ShapeRadius::from_gecko_style_coord(other) - .expect("<shape-radius> should be a length, percentage, calc, or keyword value") - } - } - impl From<ShapeBox> for StyleGeometryBox { fn from(reference: ShapeBox) -> Self { use crate::gecko_bindings::structs::StyleGeometryBox::*; diff --git a/components/style/gecko/values.rs b/components/style/gecko/values.rs index 8b05e1520b4..ba2074d8fdc 100644 --- a/components/style/gecko/values.rs +++ b/components/style/gecko/values.rs @@ -8,12 +8,10 @@ use crate::counter_style::{Symbol, Symbols}; use crate::gecko_bindings::structs::{nsStyleCoord, CounterStylePtr}; -use crate::gecko_bindings::structs::{StyleGridTrackBreadth, StyleShapeRadius}; +use crate::gecko_bindings::structs::StyleGridTrackBreadth; use crate::gecko_bindings::sugar::ns_style_coord::{CoordData, CoordDataMut, CoordDataValue}; -use crate::values::computed::basic_shape::ShapeRadius as ComputedShapeRadius; use crate::values::computed::{Angle, Length, LengthPercentage}; use crate::values::computed::{Number, NumberOrPercentage, Percentage}; -use crate::values::generics::basic_shape::ShapeRadius; use crate::values::generics::gecko::ScrollSnapPoint; use crate::values::generics::grid::{TrackBreadth, TrackKeyword}; use crate::values::generics::length::LengthPercentageOrAuto; @@ -192,35 +190,6 @@ impl<L: GeckoStyleCoordConvertible> GeckoStyleCoordConvertible for TrackBreadth< } } -impl GeckoStyleCoordConvertible for ComputedShapeRadius { - fn to_gecko_style_coord<T: CoordDataMut>(&self, coord: &mut T) { - match *self { - ShapeRadius::ClosestSide => coord.set_value(CoordDataValue::Enumerated( - StyleShapeRadius::ClosestSide as u32, - )), - ShapeRadius::FarthestSide => coord.set_value(CoordDataValue::Enumerated( - StyleShapeRadius::FarthestSide as u32, - )), - ShapeRadius::Length(lp) => lp.to_gecko_style_coord(coord), - } - } - - fn from_gecko_style_coord<T: CoordData>(coord: &T) -> Option<Self> { - match coord.as_value() { - CoordDataValue::Enumerated(v) => { - if v == StyleShapeRadius::ClosestSide as u32 { - Some(ShapeRadius::ClosestSide) - } else if v == StyleShapeRadius::FarthestSide as u32 { - Some(ShapeRadius::FarthestSide) - } else { - None - } - }, - _ => GeckoStyleCoordConvertible::from_gecko_style_coord(coord).map(ShapeRadius::Length), - } - } -} - impl<T: GeckoStyleCoordConvertible> GeckoStyleCoordConvertible for Option<T> { fn to_gecko_style_coord<U: CoordDataMut>(&self, coord: &mut U) { if let Some(ref me) = *self { diff --git a/components/style/owned_slice.rs b/components/style/owned_slice.rs index a92a6269e70..e1a82c0176f 100644 --- a/components/style/owned_slice.rs +++ b/components/style/owned_slice.rs @@ -20,6 +20,9 @@ use to_shmem::{SharedMemoryBuilder, ToShmem}; /// /// But handling fat pointers with cbindgen both in structs and argument /// positions more generally is a bit tricky. +/// +/// cbindgen:derive-eq=false +/// cbindgen:derive-neq=false #[repr(C)] pub struct OwnedSlice<T: Sized> { ptr: NonNull<T>, diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 537dbb661f4..1f7603c923d 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -4046,16 +4046,15 @@ fn set_style_svg_path( <%def name="impl_shape_source(ident, gecko_ffi_name)"> pub fn set_${ident}(&mut self, v: longhands::${ident}::computed_value::T) { - use crate::gecko_bindings::bindings::{Gecko_NewBasicShape, Gecko_DestroyShapeSource}; - use crate::gecko_bindings::structs::{StyleBasicShape, StyleBasicShapeType, StyleShapeSourceType}; - use crate::gecko_bindings::structs::{StyleGeometryBox, StyleShapeSource}; - use crate::gecko::values::GeckoStyleCoordConvertible; - use crate::values::generics::basic_shape::{BasicShape, ShapeSource}; + use crate::values::generics::basic_shape::ShapeSource; + use crate::gecko_bindings::structs::StyleShapeSourceType; + use crate::gecko_bindings::structs::StyleGeometryBox; let ref mut ${ident} = self.gecko.${gecko_ffi_name}; - // clean up existing struct - unsafe { Gecko_DestroyShapeSource(${ident}) }; + // clean up existing struct. + unsafe { bindings::Gecko_DestroyShapeSource(${ident}) }; + ${ident}.mType = StyleShapeSourceType::None; match v { @@ -4084,72 +4083,12 @@ fn set_style_svg_path( } ShapeSource::Path(p) => set_style_svg_path(${ident}, &p.path, p.fill), ShapeSource::Shape(servo_shape, maybe_box) => { - fn init_shape(${ident}: &mut StyleShapeSource, basic_shape_type: StyleBasicShapeType) - -> &mut StyleBasicShape { - unsafe { - // Create StyleBasicShape in StyleShapeSource. mReferenceBox and mType - // will be set manually later. - Gecko_NewBasicShape(${ident}, basic_shape_type); - &mut *${ident}.__bindgen_anon_1.mBasicShape.as_mut().mPtr - } - } - match servo_shape { - BasicShape::Inset(inset) => { - let shape = init_shape(${ident}, StyleBasicShapeType::Inset); - unsafe { shape.mCoordinates.set_len(4) }; - - // set_len() can't call constructors, so the coordinates - // can contain any value. set_value() attempts to free - // allocated coordinates, so we don't want to feed it - // garbage values which it may misinterpret. - // Instead, we use leaky_set_value to blindly overwrite - // the garbage data without - // attempting to clean up. - shape.mCoordinates[0].leaky_set_null(); - inset.rect.0.to_gecko_style_coord(&mut shape.mCoordinates[0]); - shape.mCoordinates[1].leaky_set_null(); - inset.rect.1.to_gecko_style_coord(&mut shape.mCoordinates[1]); - shape.mCoordinates[2].leaky_set_null(); - inset.rect.2.to_gecko_style_coord(&mut shape.mCoordinates[2]); - shape.mCoordinates[3].leaky_set_null(); - inset.rect.3.to_gecko_style_coord(&mut shape.mCoordinates[3]); - shape.mRadius = inset.round; - } - BasicShape::Circle(circ) => { - let shape = init_shape(${ident}, StyleBasicShapeType::Circle); - unsafe { shape.mCoordinates.set_len(1) }; - shape.mCoordinates[0].leaky_set_null(); - circ.radius.to_gecko_style_coord(&mut shape.mCoordinates[0]); - - shape.mPosition = circ.position.into(); - } - BasicShape::Ellipse(el) => { - let shape = init_shape(${ident}, StyleBasicShapeType::Ellipse); - unsafe { shape.mCoordinates.set_len(2) }; - shape.mCoordinates[0].leaky_set_null(); - el.semiaxis_x.to_gecko_style_coord(&mut shape.mCoordinates[0]); - shape.mCoordinates[1].leaky_set_null(); - el.semiaxis_y.to_gecko_style_coord(&mut shape.mCoordinates[1]); - - shape.mPosition = el.position.into(); - } - BasicShape::Polygon(poly) => { - let shape = init_shape(${ident}, StyleBasicShapeType::Polygon); - unsafe { - shape.mCoordinates.set_len(poly.coordinates.len() as u32 * 2); - } - for (i, coord) in poly.coordinates.iter().enumerate() { - shape.mCoordinates[2 * i].leaky_set_null(); - shape.mCoordinates[2 * i + 1].leaky_set_null(); - coord.0.to_gecko_style_coord(&mut shape.mCoordinates[2 * i]); - coord.1.to_gecko_style_coord(&mut shape.mCoordinates[2 * i + 1]); - } - shape.mFillRule = poly.fill; - } + unsafe { + ${ident}.__bindgen_anon_1.mBasicShape.as_mut().mPtr = + Box::into_raw(servo_shape); } - - ${ident}.mReferenceBox = maybe_box.map(Into::into) - .unwrap_or(StyleGeometryBox::NoBox); + ${ident}.mReferenceBox = + maybe_box.map(Into::into).unwrap_or(StyleGeometryBox::NoBox); ${ident}.mType = StyleShapeSourceType::Shape; } } diff --git a/components/style/properties/longhands/svg.mako.rs b/components/style/properties/longhands/svg.mako.rs index 1a84c1d669f..19699aa1c96 100644 --- a/components/style/properties/longhands/svg.mako.rs +++ b/components/style/properties/longhands/svg.mako.rs @@ -87,8 +87,8 @@ ${helpers.predefined_type( "basic_shape::ClippingShape", "generics::basic_shape::ShapeSource::None", products="gecko", - boxed=True, animation_value_type="basic_shape::ClippingShape", + boxed=True, flags="CREATES_STACKING_CONTEXT", spec="https://drafts.fxtf.org/css-masking/#propdef-clip-path", )} diff --git a/components/style/values/animated/mod.rs b/components/style/values/animated/mod.rs index a1e5ca4618c..6f8de1decca 100644 --- a/components/style/values/animated/mod.rs +++ b/components/style/values/animated/mod.rs @@ -16,7 +16,6 @@ use crate::values::computed::Image; use crate::values::specified::SVGPathData; use crate::values::CSSFloat; use app_units::Au; -use euclid::Point2D; use smallvec::SmallVec; use std::cmp; @@ -241,16 +240,10 @@ impl Animate for Au { } } -impl<T> Animate for Point2D<T> -where - T: Animate, -{ +impl<T: Animate> Animate for Box<T> { #[inline] fn animate(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> { - Ok(Point2D::new( - self.x.animate(&other.x, procedure)?, - self.y.animate(&other.y, procedure)?, - )) + Ok(Box::new((**self).animate(&other, procedure)?)) } } @@ -288,6 +281,24 @@ where } } +impl<T> ToAnimatedValue for Box<T> +where + T: ToAnimatedValue, +{ + type AnimatedValue = Box<<T as ToAnimatedValue>::AnimatedValue>; + + #[inline] + fn to_animated_value(self) -> Self::AnimatedValue { + Box::new((*self).to_animated_value()) + } + + #[inline] + fn from_animated_value(animated: Self::AnimatedValue) -> Self { + Box::new(T::from_animated_value(*animated)) + } +} + + impl<T> ToAnimatedValue for Box<[T]> where T: ToAnimatedValue, @@ -328,7 +339,7 @@ where #[inline] fn from_animated_value(animated: Self::AnimatedValue) -> Self { - Box::from_animated_value(animated.into_box()).into() + Self::from(Box::from_animated_value(animated.into_box())) } } diff --git a/components/style/values/computed/basic_shape.rs b/components/style/values/computed/basic_shape.rs index 28067fb0c81..9a245aa77f1 100644 --- a/components/style/values/computed/basic_shape.rs +++ b/components/style/values/computed/basic_shape.rs @@ -23,7 +23,7 @@ pub type ClippingShape = generic::ClippingShape<BasicShape, ComputedUrl>; pub type FloatAreaShape = generic::FloatAreaShape<BasicShape, Image>; /// A computed basic shape. -pub type BasicShape = generic::BasicShape< +pub type BasicShape = generic::GenericBasicShape< LengthPercentage, LengthPercentage, LengthPercentage, @@ -41,7 +41,7 @@ pub type Ellipse = generic::Ellipse<LengthPercentage, LengthPercentage, NonNegativeLengthPercentage>; /// The computed value of `ShapeRadius` -pub type ShapeRadius = generic::ShapeRadius<NonNegativeLengthPercentage>; +pub type ShapeRadius = generic::GenericShapeRadius<NonNegativeLengthPercentage>; impl ToCss for Circle { fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result diff --git a/components/style/values/generics/basic_shape.rs b/components/style/values/generics/basic_shape.rs index 5999e914676..8c63d064817 100644 --- a/components/style/values/generics/basic_shape.rs +++ b/components/style/values/generics/basic_shape.rs @@ -7,8 +7,8 @@ use crate::values::animated::{Animate, Procedure, ToAnimatedZero}; use crate::values::distance::{ComputeSquaredDistance, SquaredDistance}; -use crate::values::generics::border::BorderRadius; -use crate::values::generics::position::Position; +use crate::values::generics::border::GenericBorderRadius; +use crate::values::generics::position::GenericPosition; use crate::values::generics::rect::Rect; use crate::values::specified::SVGPathData; use crate::Zero; @@ -89,7 +89,7 @@ pub enum ShapeBox { pub enum ShapeSource<BasicShape, ReferenceBox, ImageOrUrl> { #[animation(error)] ImageOrUrl(ImageOrUrl), - Shape(BasicShape, Option<ReferenceBox>), + Shape(Box<BasicShape>, Option<ReferenceBox>), #[animation(error)] Box(ReferenceBox), #[css(function)] @@ -113,7 +113,8 @@ pub enum ShapeSource<BasicShape, ReferenceBox, ImageOrUrl> { ToResolvedValue, ToShmem, )] -pub enum BasicShape<H, V, LengthPercentage, NonNegativeLengthPercentage> { +#[repr(C, u8)] +pub enum GenericBasicShape<H, V, LengthPercentage, NonNegativeLengthPercentage> { Inset( #[css(field_bound)] #[shmem(field_bound)] @@ -129,9 +130,11 @@ pub enum BasicShape<H, V, LengthPercentage, NonNegativeLengthPercentage> { #[shmem(field_bound)] Ellipse<H, V, NonNegativeLengthPercentage>, ), - Polygon(Polygon<LengthPercentage>), + Polygon(GenericPolygon<LengthPercentage>), } +pub use self::GenericBasicShape as BasicShape; + /// <https://drafts.csswg.org/css-shapes/#funcdef-inset> #[allow(missing_docs)] #[css(function = "inset")] @@ -148,10 +151,11 @@ pub enum BasicShape<H, V, LengthPercentage, NonNegativeLengthPercentage> { ToResolvedValue, ToShmem, )] +#[repr(C)] pub struct InsetRect<LengthPercentage, NonNegativeLengthPercentage> { pub rect: Rect<LengthPercentage>, #[shmem(field_bound)] - pub round: BorderRadius<NonNegativeLengthPercentage>, + pub round: GenericBorderRadius<NonNegativeLengthPercentage>, } /// <https://drafts.csswg.org/css-shapes/#funcdef-circle> @@ -171,9 +175,10 @@ pub struct InsetRect<LengthPercentage, NonNegativeLengthPercentage> { ToResolvedValue, ToShmem, )] +#[repr(C)] pub struct Circle<H, V, NonNegativeLengthPercentage> { - pub position: Position<H, V>, - pub radius: ShapeRadius<NonNegativeLengthPercentage>, + pub position: GenericPosition<H, V>, + pub radius: GenericShapeRadius<NonNegativeLengthPercentage>, } /// <https://drafts.csswg.org/css-shapes/#funcdef-ellipse> @@ -193,10 +198,11 @@ pub struct Circle<H, V, NonNegativeLengthPercentage> { ToResolvedValue, ToShmem, )] +#[repr(C)] pub struct Ellipse<H, V, NonNegativeLengthPercentage> { - pub position: Position<H, V>, - pub semiaxis_x: ShapeRadius<NonNegativeLengthPercentage>, - pub semiaxis_y: ShapeRadius<NonNegativeLengthPercentage>, + pub position: GenericPosition<H, V>, + pub semiaxis_x: GenericShapeRadius<NonNegativeLengthPercentage>, + pub semiaxis_y: GenericShapeRadius<NonNegativeLengthPercentage>, } /// <https://drafts.csswg.org/css-shapes/#typedef-shape-radius> @@ -216,7 +222,8 @@ pub struct Ellipse<H, V, NonNegativeLengthPercentage> { ToResolvedValue, ToShmem, )] -pub enum ShapeRadius<NonNegativeLengthPercentage> { +#[repr(C, u8)] +pub enum GenericShapeRadius<NonNegativeLengthPercentage> { Length(NonNegativeLengthPercentage), #[animation(error)] ClosestSide, @@ -224,10 +231,12 @@ pub enum ShapeRadius<NonNegativeLengthPercentage> { FarthestSide, } +pub use self::GenericShapeRadius as ShapeRadius; + /// A generic type for representing the `polygon()` function /// /// <https://drafts.csswg.org/css-shapes/#funcdef-polygon> -#[css(comma, function)] +#[css(comma, function = "polygon")] #[derive( Clone, Debug, @@ -240,15 +249,18 @@ pub enum ShapeRadius<NonNegativeLengthPercentage> { ToResolvedValue, ToShmem, )] -pub struct Polygon<LengthPercentage> { +#[repr(C)] +pub struct GenericPolygon<LengthPercentage> { /// The filling rule for a polygon. #[css(skip_if = "fill_is_default")] pub fill: FillRule, /// A collection of (x, y) coordinates to draw the polygon. #[css(iterable)] - pub coordinates: Vec<PolygonCoord<LengthPercentage>>, + pub coordinates: crate::OwnedSlice<PolygonCoord<LengthPercentage>>, } +pub use self::GenericPolygon as Polygon; + /// Coordinates for Polygon. #[derive( Clone, @@ -262,6 +274,7 @@ pub struct Polygon<LengthPercentage> { ToResolvedValue, ToShmem, )] +#[repr(C)] pub struct PolygonCoord<LengthPercentage>(pub LengthPercentage, pub LengthPercentage); // https://drafts.csswg.org/css-shapes/#typedef-fill-rule @@ -393,7 +406,8 @@ where this.1.animate(&other.1, procedure)?, )) }) - .collect::<Result<Vec<_>, _>>()?; + .collect::<Result<Vec<_>, _>>()? + .into(); Ok(Polygon { fill: self.fill, coordinates, diff --git a/components/style/values/specified/basic_shape.rs b/components/style/values/specified/basic_shape.rs index 014ce439d3c..70eab983510 100644 --- a/components/style/values/specified/basic_shape.rs +++ b/components/style/values/specified/basic_shape.rs @@ -55,7 +55,7 @@ pub type Ellipse = pub type ShapeRadius = generic::ShapeRadius<NonNegativeLengthPercentage>; /// The specified value of `Polygon` -pub type Polygon = generic::Polygon<LengthPercentage>; +pub type Polygon = generic::GenericPolygon<LengthPercentage>; #[cfg(feature = "gecko")] fn is_clip_path_path_enabled(context: &ParserContext) -> bool { @@ -138,11 +138,11 @@ where } if let Some(shp) = shape { - return Ok(ShapeSource::Shape(shp, ref_box)); + return Ok(ShapeSource::Shape(Box::new(shp), ref_box)); } ref_box - .map(|v| ShapeSource::Box(v)) + .map(ShapeSource::Box) .ok_or(input.new_custom_error(StyleParseErrorKind::UnspecifiedError)) } } @@ -152,7 +152,7 @@ impl Parse for GeometryBox { _context: &ParserContext, input: &mut Parser<'i, 't>, ) -> Result<Self, ParseError<'i>> { - if let Ok(shape_box) = input.try(|i| ShapeBox::parse(i)) { + if let Ok(shape_box) = input.try(ShapeBox::parse) { return Ok(GeometryBox::ShapeBox(shape_box)); } @@ -352,17 +352,14 @@ impl Polygon { }) .unwrap_or_default(); - let buf = input.parse_comma_separated(|i| { + let coordinates = input.parse_comma_separated(|i| { Ok(PolygonCoord( LengthPercentage::parse(context, i)?, LengthPercentage::parse(context, i)?, )) - })?; + })?.into(); - Ok(Polygon { - fill: fill, - coordinates: buf, - }) + Ok(Polygon { fill, coordinates }) } } |