From b9f6994dccfc550259a220fa4630e4536fa5c72d Mon Sep 17 00:00:00 2001 From: Mantaroh Yoshinaga Date: Tue, 13 Jun 2017 10:43:34 +0900 Subject: [PATCH] Add compute distance for Filter. --- .../helpers/animated_properties.mako.rs | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index 3b0a9860ab1..0e7db04bbf7 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -3353,6 +3353,27 @@ fn add_weighted_filter_function(from: Option<<&IntermediateFilter>, } } +fn compute_filter_square_distance(from: &IntermediateFilter, + to: &IntermediateFilter) + -> Result { + match (from, to) { + % for func in FILTER_FUNCTIONS : + (&IntermediateFilter::${func}(f), + &IntermediateFilter::${func}(t)) => { + Ok(try!(f.compute_squared_distance(&t))) + }, + % endfor + % if product == "gecko": + (&IntermediateFilter::DropShadow(f), + &IntermediateFilter::DropShadow(t)) => { + Ok(try!(f.compute_squared_distance(&t))) + }, + % endif + _ => { + Err(()) + } + } +} impl Animatable for IntermediateFilters { #[inline] @@ -3387,4 +3408,44 @@ impl Animatable for IntermediateFilters { vec![&from_list[..], &to_list[..]].concat(); Ok(filters) } + + #[inline] + fn compute_distance(&self, other: &Self) -> Result { + self.compute_squared_distance(other).map(|sd| sd.sqrt()) + } + + #[inline] + fn compute_squared_distance(&self, other: &Self) -> Result { + let mut square_distance: f64 = 0.0; + let mut from_iter = self.iter(); + let mut to_iter = (&other).iter(); + + let mut from = from_iter.next(); + let mut to = to_iter.next(); + while (from,to) != (None, None) { + let current_square_distance: f64 ; + if from == 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 == 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; + } + Ok(square_distance.sqrt()) + } }