diff --git a/Cargo.lock b/Cargo.lock index 79e079fb9f3..6f4fa58963a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3011,6 +3011,7 @@ dependencies = [ "heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "html5ever 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", + "itertools 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/style/Cargo.toml b/components/style/Cargo.toml index f09485c3cc2..01436213ce7 100644 --- a/components/style/Cargo.toml +++ b/components/style/Cargo.toml @@ -44,6 +44,7 @@ euclid = "0.15" fnv = "1.0" heapsize = {version = "0.4", optional = true} heapsize_derive = {version = "0.1", optional = true} +itertools = "0.5" itoa = "0.3" html5ever = {version = "0.18", optional = true} lazy_static = "0.2" diff --git a/components/style/lib.rs b/components/style/lib.rs index aae19500a71..b82d2fd3cc0 100644 --- a/components/style/lib.rs +++ b/components/style/lib.rs @@ -51,6 +51,7 @@ extern crate fnv; #[cfg(feature = "gecko")] #[macro_use] pub mod gecko_string_cache; #[cfg(feature = "servo")] extern crate heapsize; #[cfg(feature = "servo")] #[macro_use] extern crate heapsize_derive; +extern crate itertools; extern crate itoa; #[cfg(feature = "servo")] #[macro_use] extern crate html5ever; #[macro_use] diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index 4b734167c7a..44501cf2990 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -925,6 +925,13 @@ impl Animatable for Angle { } } } + + #[inline] + fn compute_distance(&self, other: &Self) -> Result { + // Use the formula for calculating the distance between angles defined in SVG: + // https://www.w3.org/TR/SVG/animate.html#complexDistances + Ok((self.radians64() - other.radians64()).abs()) + } } /// https://drafts.csswg.org/css-transitions/#animtype-percentage @@ -3172,37 +3179,21 @@ impl Animatable for AnimatedFilterList { #[inline] fn compute_squared_distance(&self, other: &Self) -> Result { + use itertools::{EitherOrBoth, Itertools}; + let mut square_distance: f64 = 0.0; - let mut from_iter = self.0.iter(); - let mut to_iter = other.0.iter(); - - let mut from = from_iter.next(); - let mut to = to_iter.next(); - while from.is_some() || to.is_some() { - let current_square_distance: f64 ; - if from.is_none() { - let none = try!(add_weighted_filter_function(to, to, 0.0, 0.0)); - current_square_distance = - compute_filter_square_distance(&none, &(to.unwrap())).unwrap(); - - to = to_iter.next(); - } else if to.is_none() { - let none = try!(add_weighted_filter_function(from, from, 0.0, 0.0)); - current_square_distance = - compute_filter_square_distance(&none, &(from.unwrap())).unwrap(); - - from = from_iter.next(); - } else { - current_square_distance = - compute_filter_square_distance(&(from.unwrap()), - &(to.unwrap())).unwrap(); - - from = from_iter.next(); - to = to_iter.next(); - } - square_distance += current_square_distance; + for it in self.0.iter().zip_longest(other.0.iter()) { + square_distance += match it { + EitherOrBoth::Both(from, to) => { + compute_filter_square_distance(&from, &to)? + }, + EitherOrBoth::Left(list) | EitherOrBoth::Right(list)=> { + let none = add_weighted_filter_function(Some(list), Some(list), 0.0, 0.0)?; + compute_filter_square_distance(&none, &list)? + }, + }; } - Ok(square_distance.sqrt()) + Ok(square_distance) } }