Bug 1353202 - Apply accumulate composite mode when compositing animations draft
authorBrian Birtles <birtles@gmail.com>
Tue, 23 May 2017 14:57:17 +0900
changeset 582821 170ba44db9a5f026e6b4d8be9d0c2be5d9d34552
parent 582820 47af1de5bb11ae3f7af7311891137444cb6a564c
child 582822 24ddceae3fe7aa644b7fbd15f310ca66dc1e259a
push id60187
push userbbirtles@mozilla.com
push dateTue, 23 May 2017 05:57:34 +0000
bugs1353202
milestone55.0a1
Bug 1353202 - Apply accumulate composite mode when compositing animations MozReview-Commit-ID: LnCYikUpXuN
servo/ports/geckolib/glue.rs
--- a/servo/ports/geckolib/glue.rs
+++ b/servo/ports/geckolib/glue.rs
@@ -367,35 +367,43 @@ pub extern "C" fn Servo_AnimationCompose
     }
 
     // Temporaries used in the following if-block whose lifetimes we need to prolong.
     let raw_from_value;
     let from_composite_result;
     let from_value = if !segment.mFromValue.mServo.mRawPtr.is_null() {
         raw_from_value = unsafe { &*segment.mFromValue.mServo.mRawPtr };
         match segment.mFromComposite {
-            CompositeOperation::Add => {
+            CompositeOperation::Add | CompositeOperation::Accumulate => {
                 let value_to_composite = AnimationValue::as_arc(&raw_from_value).as_ref();
-                from_composite_result = underlying_value.as_ref().unwrap().add(value_to_composite);
+                from_composite_result = if segment.mFromComposite == CompositeOperation::Add {
+                    underlying_value.as_ref().unwrap().add(value_to_composite)
+                } else {
+                    underlying_value.as_ref().unwrap().accumulate(value_to_composite, 1)
+                };
                 from_composite_result.as_ref().unwrap_or(value_to_composite)
             }
             _ => { AnimationValue::as_arc(&raw_from_value) }
         }
     } else {
         underlying_value.as_ref().unwrap()
     };
 
     let raw_to_value;
     let to_composite_result;
     let to_value = if !segment.mToValue.mServo.mRawPtr.is_null() {
         raw_to_value = unsafe { &*segment.mToValue.mServo.mRawPtr };
         match segment.mToComposite {
-            CompositeOperation::Add => {
+            CompositeOperation::Add | CompositeOperation::Accumulate => {
                 let value_to_composite = AnimationValue::as_arc(&raw_to_value).as_ref();
-                to_composite_result = underlying_value.as_ref().unwrap().add(value_to_composite);
+                to_composite_result = if segment.mToComposite == CompositeOperation::Add {
+                    underlying_value.as_ref().unwrap().add(value_to_composite)
+                } else {
+                    underlying_value.as_ref().unwrap().accumulate(value_to_composite, 1)
+                };
                 to_composite_result.as_ref().unwrap_or(value_to_composite)
             }
             _ => { AnimationValue::as_arc(&raw_to_value) }
         }
     } else {
         underlying_value.as_ref().unwrap()
     };