mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Implement animation addition in Servo_AnimationCompose
This commit is contained in:
parent
49bc7b9e69
commit
5539728b3c
1 changed files with 28 additions and 9 deletions
|
@ -62,6 +62,7 @@ use style::gecko_bindings::structs;
|
||||||
use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleSheet};
|
use style::gecko_bindings::structs::{RawServoStyleRule, ServoStyleSheet};
|
||||||
use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom, nsCSSPropertyID};
|
use style::gecko_bindings::structs::{SheetParsingMode, nsIAtom, nsCSSPropertyID};
|
||||||
use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, nsCSSFontFaceRule};
|
use style::gecko_bindings::structs::{nsRestyleHint, nsChangeHint, nsCSSFontFaceRule};
|
||||||
|
use style::gecko_bindings::structs::CompositeOperation;
|
||||||
use style::gecko_bindings::structs::Loader;
|
use style::gecko_bindings::structs::Loader;
|
||||||
use style::gecko_bindings::structs::RawGeckoPresContextOwned;
|
use style::gecko_bindings::structs::RawGeckoPresContextOwned;
|
||||||
use style::gecko_bindings::structs::ServoElementSnapshotTable;
|
use style::gecko_bindings::structs::ServoElementSnapshotTable;
|
||||||
|
@ -325,12 +326,16 @@ pub extern "C" fn Servo_AnimationCompose(raw_value_map: RawServoAnimationValueMa
|
||||||
let property: TransitionProperty = css_property.into();
|
let property: TransitionProperty = css_property.into();
|
||||||
let value_map = AnimationValueMap::from_ffi_mut(raw_value_map);
|
let value_map = AnimationValueMap::from_ffi_mut(raw_value_map);
|
||||||
|
|
||||||
|
let need_underlying_value = segment.mFromValue.mServo.mRawPtr.is_null() ||
|
||||||
|
segment.mToValue.mServo.mRawPtr.is_null() ||
|
||||||
|
segment.mFromComposite != CompositeOperation::Replace ||
|
||||||
|
segment.mToComposite != CompositeOperation::Replace;
|
||||||
|
|
||||||
// If either of the segment endpoints are null, get the underlying value to
|
// If either of the segment endpoints are null, get the underlying value to
|
||||||
// use from the current value in the values map (set by a lower-priority
|
// use from the current value in the values map (set by a lower-priority
|
||||||
// effect), or, if there is no current value, look up the cached base value
|
// effect), or, if there is no current value, look up the cached base value
|
||||||
// for this property.
|
// for this property.
|
||||||
let underlying_value = if segment.mFromValue.mServo.mRawPtr.is_null() ||
|
let underlying_value = if need_underlying_value {
|
||||||
segment.mToValue.mServo.mRawPtr.is_null() {
|
|
||||||
let previous_composed_value = value_map.get(&property).cloned();
|
let previous_composed_value = value_map.get(&property).cloned();
|
||||||
previous_composed_value.or_else(|| {
|
previous_composed_value.or_else(|| {
|
||||||
let raw_base_style = unsafe { Gecko_AnimationGetBaseStyle(base_values, css_property) };
|
let raw_base_style = unsafe { Gecko_AnimationGetBaseStyle(base_values, css_property) };
|
||||||
|
@ -340,26 +345,40 @@ pub extern "C" fn Servo_AnimationCompose(raw_value_map: RawServoAnimationValueMa
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
if (segment.mFromValue.mServo.mRawPtr.is_null() ||
|
if need_underlying_value && underlying_value.is_none() {
|
||||||
segment.mToValue.mServo.mRawPtr.is_null()) &&
|
warn!("Underlying value should be valid when we expect to use it");
|
||||||
underlying_value.is_none() {
|
|
||||||
warn!("Underlying value should be valid in the case where either 'from' value or 'to' value is null");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Declare for making derefenced raw pointer alive outside the if block.
|
// Temporaries used in the following if-block whose lifetimes we need to prlong.
|
||||||
let raw_from_value;
|
let raw_from_value;
|
||||||
|
let from_composite_result;
|
||||||
let from_value = if !segment.mFromValue.mServo.mRawPtr.is_null() {
|
let from_value = if !segment.mFromValue.mServo.mRawPtr.is_null() {
|
||||||
raw_from_value = unsafe { &*segment.mFromValue.mServo.mRawPtr };
|
raw_from_value = unsafe { &*segment.mFromValue.mServo.mRawPtr };
|
||||||
AnimationValue::as_arc(&raw_from_value).as_ref()
|
match segment.mFromComposite {
|
||||||
|
CompositeOperation::Add => {
|
||||||
|
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.as_ref().unwrap_or(value_to_composite)
|
||||||
|
}
|
||||||
|
_ => { AnimationValue::as_arc(&raw_from_value) }
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
underlying_value.as_ref().unwrap()
|
underlying_value.as_ref().unwrap()
|
||||||
};
|
};
|
||||||
|
|
||||||
let raw_to_value;
|
let raw_to_value;
|
||||||
|
let to_composite_result;
|
||||||
let to_value = if !segment.mToValue.mServo.mRawPtr.is_null() {
|
let to_value = if !segment.mToValue.mServo.mRawPtr.is_null() {
|
||||||
raw_to_value = unsafe { &*segment.mToValue.mServo.mRawPtr };
|
raw_to_value = unsafe { &*segment.mToValue.mServo.mRawPtr };
|
||||||
AnimationValue::as_arc(&raw_to_value).as_ref()
|
match segment.mToComposite {
|
||||||
|
CompositeOperation::Add => {
|
||||||
|
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.as_ref().unwrap_or(value_to_composite)
|
||||||
|
}
|
||||||
|
_ => { AnimationValue::as_arc(&raw_to_value) }
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
underlying_value.as_ref().unwrap()
|
underlying_value.as_ref().unwrap()
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue