Merge BoxShadowList and TextShadowList into ShadowList<T>

This commit is contained in:
Anthony Ramine 2017-06-30 15:57:54 +02:00
parent 6f6ee6e036
commit 80bd11bb8c

View file

@ -4,7 +4,6 @@
//! Animated types for CSS values related to effects. //! Animated types for CSS values related to effects.
use app_units::Au;
use properties::animated_properties::{Animatable, IntermediateColor}; use properties::animated_properties::{Animatable, IntermediateColor};
use properties::longhands::box_shadow::computed_value::T as ComputedBoxShadowList; use properties::longhands::box_shadow::computed_value::T as ComputedBoxShadowList;
use properties::longhands::filter::computed_value::T as ComputedFilterList; use properties::longhands::filter::computed_value::T as ComputedFilterList;
@ -19,10 +18,18 @@ use values::generics::effects::BoxShadow as GenericBoxShadow;
use values::generics::effects::Filter as GenericFilter; use values::generics::effects::Filter as GenericFilter;
use values::generics::effects::SimpleShadow as GenericSimpleShadow; use values::generics::effects::SimpleShadow as GenericSimpleShadow;
/// An animated value for the `box-shadow` property.
pub type BoxShadowList = ShadowList<BoxShadow>;
/// An animated value for the `text-shadow` property.
pub type TextShadowList = ShadowList<SimpleShadow>;
/// An animated value for shadow lists.
///
/// https://drafts.csswg.org/css-transitions/#animtype-shadow-list
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
/// An animated value for the `box-shadow` property. pub struct ShadowList<Shadow>(Vec<Shadow>);
pub struct BoxShadowList(pub Vec<BoxShadow>);
/// An animated value for a single `box-shadow`. /// An animated value for a single `box-shadow`.
pub type BoxShadow = GenericBoxShadow<IntermediateColor, Length, Length>; pub type BoxShadow = GenericBoxShadow<IntermediateColor, Length, Length>;
@ -40,11 +47,6 @@ pub type Filter = GenericFilter<Angle, Number, Length, SimpleShadow>;
#[cfg(not(feature = "gecko"))] #[cfg(not(feature = "gecko"))]
pub type Filter = GenericFilter<Angle, Number, Length, Impossible>; pub type Filter = GenericFilter<Angle, Number, Length, Impossible>;
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
#[derive(Clone, Debug, PartialEq)]
/// An animated value for the `box-shadow` property.
pub struct TextShadowList(pub Vec<SimpleShadow>);
/// An animated value for the `drop-shadow()` filter. /// An animated value for the `drop-shadow()` filter.
pub type SimpleShadow = GenericSimpleShadow<IntermediateColor, Length, Length>; pub type SimpleShadow = GenericSimpleShadow<IntermediateColor, Length, Length>;
@ -53,7 +55,7 @@ impl ToAnimatedValue for ComputedBoxShadowList {
#[inline] #[inline]
fn to_animated_value(self) -> Self::AnimatedValue { fn to_animated_value(self) -> Self::AnimatedValue {
BoxShadowList(self.0.to_animated_value()) ShadowList(self.0.to_animated_value())
} }
#[inline] #[inline]
@ -62,8 +64,10 @@ impl ToAnimatedValue for ComputedBoxShadowList {
} }
} }
/// https://drafts.csswg.org/css-transitions/#animtype-shadow-list impl<S> Animatable for ShadowList<S>
impl Animatable for BoxShadowList { where
S: Animatable + Clone,
{
#[inline] #[inline]
fn add_weighted( fn add_weighted(
&self, &self,
@ -71,18 +75,6 @@ impl Animatable for BoxShadowList {
self_portion: f64, self_portion: f64,
other_portion: f64, other_portion: f64,
) -> Result<Self, ()> { ) -> Result<Self, ()> {
// The inset value must change
let mut zero = BoxShadow {
base: SimpleShadow {
color: IntermediateColor::transparent(),
horizontal: Au(0),
vertical: Au(0),
blur: Au(0),
},
spread: Au(0),
inset: false,
};
let max_len = cmp::max(self.0.len(), other.0.len()); let max_len = cmp::max(self.0.len(), other.0.len());
let mut shadows = Vec::with_capacity(max_len); let mut shadows = Vec::with_capacity(max_len);
for i in 0..max_len { for i in 0..max_len {
@ -91,23 +83,20 @@ impl Animatable for BoxShadowList {
shadow.add_weighted(other, self_portion, other_portion)? shadow.add_weighted(other, self_portion, other_portion)?
}, },
(Some(shadow), None) => { (Some(shadow), None) => {
zero.inset = shadow.inset; shadow.add_weighted(&shadow.get_zero_value()?, self_portion, other_portion)?
shadow.add_weighted(&zero, self_portion, other_portion)?
}, },
(None, Some(shadow)) => { (None, Some(shadow)) => {
zero.inset = shadow.inset; shadow.get_zero_value()?.add_weighted(&shadow, self_portion, other_portion)?
zero.add_weighted(&shadow, self_portion, other_portion)?
}, },
(None, None) => unreachable!(), (None, None) => unreachable!(),
}); });
} }
Ok(ShadowList(shadows))
Ok(BoxShadowList(shadows))
} }
#[inline] #[inline]
fn add(&self, other: &Self) -> Result<Self, ()> { fn add(&self, other: &Self) -> Result<Self, ()> {
Ok(BoxShadowList( Ok(ShadowList(
self.0.iter().cloned().chain(other.0.iter().cloned()).collect(), self.0.iter().cloned().chain(other.0.iter().cloned()).collect(),
)) ))
} }
@ -118,7 +107,7 @@ impl ToAnimatedValue for ComputedTextShadowList {
#[inline] #[inline]
fn to_animated_value(self) -> Self::AnimatedValue { fn to_animated_value(self) -> Self::AnimatedValue {
TextShadowList(self.0.to_animated_value()) ShadowList(self.0.to_animated_value())
} }
#[inline] #[inline]
@ -127,50 +116,6 @@ impl ToAnimatedValue for ComputedTextShadowList {
} }
} }
/// https://drafts.csswg.org/css-transitions/#animtype-shadow-list
impl Animatable for TextShadowList {
#[inline]
fn add_weighted(
&self,
other: &Self,
self_portion: f64,
other_portion: f64,
) -> Result<Self, ()> {
let zero = SimpleShadow {
color: IntermediateColor::transparent(),
horizontal: Au(0),
vertical: Au(0),
blur: Au(0),
};
let max_len = cmp::max(self.0.len(), other.0.len());
let mut shadows = Vec::with_capacity(max_len);
for i in 0..max_len {
shadows.push(match (self.0.get(i), other.0.get(i)) {
(Some(shadow), Some(other)) => {
shadow.add_weighted(other, self_portion, other_portion)?
},
(Some(shadow), None) => {
shadow.add_weighted(&zero, self_portion, other_portion)?
},
(None, Some(shadow)) => {
zero.add_weighted(&shadow, self_portion, other_portion)?
},
(None, None) => unreachable!(),
});
}
Ok(TextShadowList(shadows))
}
#[inline]
fn add(&self, other: &Self) -> Result<Self, ()> {
Ok(TextShadowList(
self.0.iter().cloned().chain(other.0.iter().cloned()).collect(),
))
}
}
impl Animatable for BoxShadow { impl Animatable for BoxShadow {
#[inline] #[inline]
fn add_weighted( fn add_weighted(
@ -189,6 +134,15 @@ impl Animatable for BoxShadow {
}) })
} }
#[inline]
fn get_zero_value(&self) -> Result<Self, ()> {
Ok(BoxShadow {
base: self.base.get_zero_value()?,
spread: self.spread.get_zero_value()?,
inset: self.inset,
})
}
#[inline] #[inline]
fn compute_distance(&self, other: &Self) -> Result<f64, ()> { fn compute_distance(&self, other: &Self) -> Result<f64, ()> {
self.compute_squared_distance(other).map(|sd| sd.sqrt()) self.compute_squared_distance(other).map(|sd| sd.sqrt())
@ -206,7 +160,6 @@ impl Animatable for BoxShadow {
} }
} }
impl ToAnimatedValue for ComputedFilterList { impl ToAnimatedValue for ComputedFilterList {
type AnimatedValue = FilterList; type AnimatedValue = FilterList;
@ -251,6 +204,16 @@ impl Animatable for SimpleShadow {
}) })
} }
#[inline]
fn get_zero_value(&self) -> Result<Self, ()> {
Ok(SimpleShadow {
color: IntermediateColor::transparent(),
horizontal: self.horizontal.get_zero_value()?,
vertical: self.vertical.get_zero_value()?,
blur: self.blur.get_zero_value()?,
})
}
#[inline] #[inline]
fn compute_distance(&self, other: &Self) -> Result<f64, ()> { fn compute_distance(&self, other: &Self) -> Result<f64, ()> {
self.compute_squared_distance(other).map(|sd| sd.sqrt()) self.compute_squared_distance(other).map(|sd| sd.sqrt())