diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index ba1a6444d42..2ab27687241 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -2212,7 +2212,6 @@ impl ComputedScale { Scale::None => (1.0, 1.0, 1.0), Scale::Scale3D(sx, sy, sz) => (sx, sy, sz), Scale::Scale(sx, sy) => (sx, sy, 1.), - Scale::ScaleX(sx) => (sx, 1., 1.), } } } @@ -2224,21 +2223,38 @@ impl Animate for ComputedScale { other: &Self, procedure: Procedure, ) -> Result { - let from = ComputedScale::resolve(self); - let to = ComputedScale::resolve(other); - - // FIXME(emilio, bug 1464791): why does this do something different than - // Scale3D / TransformOperation::Scale3D? - if procedure == Procedure::Add { - // scale(x1,y1,z1)*scale(x2,y2,z2) = scale(x1*x2, y1*y2, z1*z2) - return Ok(Scale::Scale3D(from.0 * to.0, from.1 * to.1, from.2 * to.2)); + match (self, other) { + (&Scale::None, &Scale::None) => Ok(Scale::None), + (&Scale::Scale3D(_, ..), _) | (_, &Scale::Scale3D(_, ..)) => { + let from = ComputedScale::resolve(self); + let to = ComputedScale::resolve(other); + // FIXME(emilio, bug 1464791): why does this do something different than + // Scale3D / TransformOperation::Scale3D? + if procedure == Procedure::Add { + // scale(x1,y1,z1)*scale(x2,y2,z2) = scale(x1*x2, y1*y2, z1*z2) + return Ok(Scale::Scale3D(from.0 * to.0, from.1 * to.1, from.2 * to.2)); + } + Ok(Scale::Scale3D( + animate_multiplicative_factor(from.0, to.0, procedure)?, + animate_multiplicative_factor(from.1, to.1, procedure)?, + animate_multiplicative_factor(from.2, to.2, procedure)?, + )) + }, + (&Scale::Scale(_, ..), _) | (_, &Scale::Scale(_, ..)) => { + let from = ComputedScale::resolve(self); + let to = ComputedScale::resolve(other); + // FIXME(emilio, bug 1464791): why does this do something different than + // Scale / TransformOperation::Scale? + if procedure == Procedure::Add { + // scale(x1,y1)*scale(x2,y2) = scale(x1*x2, y1*y2) + return Ok(Scale::Scale(from.0 * to.0, from.1 * to.1)); + } + Ok(Scale::Scale( + animate_multiplicative_factor(from.0, to.0, procedure)?, + animate_multiplicative_factor(from.1, to.1, procedure)?, + )) + }, } - - Ok(Scale::Scale3D( - animate_multiplicative_factor(from.0, to.0, procedure)?, - animate_multiplicative_factor(from.1, to.1, procedure)?, - animate_multiplicative_factor(from.2, to.2, procedure)?, - )) } } diff --git a/components/style/values/computed/transform.rs b/components/style/values/computed/transform.rs index 9590ad4025f..6b781c7bc54 100644 --- a/components/style/values/computed/transform.rs +++ b/components/style/values/computed/transform.rs @@ -367,8 +367,9 @@ impl Scale { pub fn to_transform_operation(&self) -> Option { match *self { generic::Scale::None => None, - generic::Scale::ScaleX(sx) => Some(generic::TransformOperation::ScaleX(sx)), - generic::Scale::Scale(sx, sy) => Some(generic::TransformOperation::Scale(sx, Some(sy))), + generic::Scale::Scale(sx, sy) => { + Some(generic::TransformOperation::Scale(sx, Some(sy))) + }, generic::Scale::Scale3D(sx, sy, sz) => { Some(generic::TransformOperation::Scale3D(sx, sy, sz)) }, @@ -378,8 +379,8 @@ impl Scale { /// Convert Scale to TransformOperation. pub fn from_transform_operation(operation: &TransformOperation) -> Scale { match *operation { - generic::TransformOperation::ScaleX(sx) => generic::Scale::ScaleX(sx), generic::TransformOperation::Scale(sx, Some(sy)) => generic::Scale::Scale(sx, sy), + generic::TransformOperation::Scale(sx, None) => generic::Scale::Scale(sx, sx), generic::TransformOperation::Scale3D(sx, sy, sz) => generic::Scale::Scale3D(sx, sy, sz), _ => unreachable!("Found unexpected value for scale"), } diff --git a/components/style/values/generics/transform.rs b/components/style/values/generics/transform.rs index b4d011fd682..5ace667ec6e 100644 --- a/components/style/values/generics/transform.rs +++ b/components/style/values/generics/transform.rs @@ -7,6 +7,8 @@ use app_units::Au; use euclid::{self, Rect, Transform3D}; use num_traits::Zero; +use std::fmt::{self, Write}; +use style_traits::{CssWriter, ToCss}; use values::computed::length::Length as ComputedLength; use values::computed::length::LengthOrPercentage as ComputedLengthOrPercentage; use values::specified::angle::Angle as SpecifiedAngle; @@ -560,7 +562,6 @@ pub enum Rotate { SpecifiedValueInfo, ToAnimatedZero, ToComputedValue, - ToCss, )] /// A value of the `Scale` property /// @@ -568,14 +569,38 @@ pub enum Rotate { pub enum Scale { /// 'none' None, - /// '' - ScaleX(Number), - /// '{2}' + /// '{1,2}' Scale(Number, Number), /// '{3}' Scale3D(Number, Number, Number), } +impl ToCss for Scale { + fn to_css(&self, dest: &mut CssWriter) -> fmt::Result + where + W: fmt::Write, + { + match self { + &Scale::None => dest.write_str("none"), + &Scale::Scale(ref x, ref y) => { + x.to_css(dest)?; + if x != y { + dest.write_char(' ')?; + y.to_css(dest)?; + } + Ok(()) + }, + &Scale::Scale3D(ref x, ref y, ref z) => { + x.to_css(dest)?; + dest.write_char(' ')?; + y.to_css(dest)?; + dest.write_char(' ')?; + z.to_css(dest) + }, + } + } +} + #[derive( Clone, ComputeSquaredDistance, diff --git a/components/style/values/specified/transform.rs b/components/style/values/specified/transform.rs index d306211329e..d397d3d3607 100644 --- a/components/style/values/specified/transform.rs +++ b/components/style/values/specified/transform.rs @@ -423,6 +423,6 @@ impl Parse for Scale { } // 'scale: ' - Ok(generic::Scale::ScaleX(sx)) + Ok(generic::Scale::Scale(sx, sx)) } }