diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index d7475992152..4a88e7a52cf 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -1289,7 +1289,11 @@ impl Animate for ComputedTransformOperation { ) => { Ok(TransformOperation::Scale( animate_multiplicative_factor(*fx, *tx, procedure)?, - Some(animate_multiplicative_factor(fy.unwrap_or(*fx), ty.unwrap_or(*tx), procedure)?), + Some(animate_multiplicative_factor( + fy.unwrap_or(*fx), + ty.unwrap_or(*tx), + procedure + )?), )) }, ( @@ -1371,6 +1375,9 @@ impl Animate for ComputedTransformOperation { _ if self.is_scale() && other.is_scale() => { self.to_scale_3d().animate(&other.to_scale_3d(), procedure) } + _ if self.is_rotate() && other.is_rotate() => { + self.to_rotate_3d().animate(&other.to_rotate_3d(), procedure) + } _ => Err(()), } } @@ -1403,6 +1410,7 @@ fn is_matched_operation(first: &ComputedTransformOperation, second: &ComputedTra // we animate scale and translate operations against each other (a, b) if a.is_translate() && b.is_translate() => true, (a, b) if a.is_scale() && b.is_scale() => true, + (a, b) if a.is_rotate() && b.is_rotate() => true, // InterpolateMatrix and AccumulateMatrix are for mismatched transform. _ => false } @@ -2734,6 +2742,9 @@ impl ComputeSquaredDistance for ComputedTransformOperation { _ if self.is_scale() && other.is_scale() => { self.to_scale_3d().compute_squared_distance(&other.to_scale_3d()) } + _ if self.is_rotate() && other.is_rotate() => { + self.to_rotate_3d().compute_squared_distance(&other.to_rotate_3d()) + } _ => Err(()), } } diff --git a/components/style/values/computed/transform.rs b/components/style/values/computed/transform.rs index fd7a7cf5c2d..bbf710c4295 100644 --- a/components/style/values/computed/transform.rs +++ b/components/style/values/computed/transform.rs @@ -151,6 +151,27 @@ impl TransformOperation { _ => unreachable!(), } } + + /// Convert to a Rotate3D. + /// + /// Must be called on a Rotate function. + pub fn to_rotate_3d(&self) -> Self { + match *self { + generic::TransformOperation::Rotate3D(..) => self.clone(), + generic::TransformOperation::RotateZ(ref angle) | + generic::TransformOperation::Rotate(ref angle) => { + generic::TransformOperation::Rotate3D(0., 0., 1., angle.clone()) + } + generic::TransformOperation::RotateX(ref angle) => { + generic::TransformOperation::Rotate3D(1., 0., 0., angle.clone()) + } + generic::TransformOperation::RotateY(ref angle) => { + generic::TransformOperation::Rotate3D(0., 1., 0., angle.clone()) + } + _ => unreachable!(), + } + } + /// Convert to a Scale3D. /// /// Must be called on a Scale function diff --git a/components/style/values/generics/transform.rs b/components/style/values/generics/transform.rs index ecd40f5a55c..0b980bdf3e1 100644 --- a/components/style/values/generics/transform.rs +++ b/components/style/values/generics/transform.rs @@ -276,6 +276,19 @@ pub struct Transform(#[css(if_empty = "none", iterable)] pub Vec); impl TransformOperation { + /// Check if it is any rotate function. + pub fn is_rotate(&self) -> bool { + use self::TransformOperation::*; + matches!( + *self, + Rotate(..) | + Rotate3D(..) | + RotateX(..) | + RotateY(..) | + RotateZ(..) + ) + } + /// Check if it is any translate function pub fn is_translate(&self) -> bool { use self::TransformOperation::*;