Bug 1336668 - Add a tweak to avoid calling interpolate() if animation_type is discrete. r?emilio
For discrete type of animations, we just need to return 'from' value if
progress is less than 0.5 and otherwise return 'to' value.
https://w3c.github.io/web-animations/#discrete-animation-type
MozReview-Commit-ID: JeQY8sHjv0z
--- a/servo/components/style/properties/helpers/animated_properties.mako.rs
+++ b/servo/components/style/properties/helpers/animated_properties.mako.rs
@@ -228,19 +228,26 @@ impl AnimatedProperty {
/// Update `style` with the proper computed style corresponding to this
/// animation at `progress`.
pub fn update(&self, style: &mut ComputedValues, progress: f64) {
match *self {
% for prop in data.longhands:
% if prop.animatable:
AnimatedProperty::${prop.camel_case}(ref from, ref to) => {
- if let Ok(value) = from.interpolate(to, progress) {
- style.mutate_${prop.style_struct.ident.strip("_")}().set_${prop.ident}(value);
- }
+ // https://w3c.github.io/web-animations/#discrete-animation-type
+ % if prop.animation_type == "discrete":
+ let value = if progress < 0.5 { *from } else { *to };
+ % else:
+ let value = match from.interpolate(to, progress) {
+ Ok(value) => value,
+ Err(()) => return,
+ };
+ % endif
+ style.mutate_${prop.style_struct.ident.strip("_")}().set_${prop.ident}(value);
}
% endif
% endfor
}
}
/// Get an animatable value from a transition-property, an old style, and a
/// new style.
@@ -420,17 +427,26 @@ impl AnimationValue {
impl Interpolate for AnimationValue {
fn interpolate(&self, other: &Self, progress: f64) -> Result<Self, ()> {
match (self, other) {
% for prop in data.longhands:
% if prop.animatable:
(&AnimationValue::${prop.camel_case}(ref from),
&AnimationValue::${prop.camel_case}(ref to)) => {
- from.interpolate(to, progress).map(AnimationValue::${prop.camel_case})
+ // https://w3c.github.io/web-animations/#discrete-animation-type
+ % if prop.animation_type == "discrete":
+ if progress < 0.5 {
+ Ok(AnimationValue::${prop.camel_case}(*from))
+ } else {
+ Ok(AnimationValue::${prop.camel_case}(*to))
+ }
+ % else:
+ from.interpolate(to, progress).map(AnimationValue::${prop.camel_case})
+ % endif
}
% endif
% endfor
_ => {
panic!("Expected interpolation of computed values of the same \
property, got: {:?}, {:?}", self, other);
}
}