Bug 1353202 - Apply accumulate composite mode when compositing animations
MozReview-Commit-ID: LnCYikUpXuN
--- 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()
};