| Index: cc/animation/element_animations.cc
|
| diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
|
| index bf8b6b83f4fabf53919518949e4c0a0d41e518bc..708cdee0b9c274285ce9c9b57de3b4894f121ee4 100644
|
| --- a/cc/animation/element_animations.cc
|
| +++ b/cc/animation/element_animations.cc
|
| @@ -150,17 +150,19 @@ void ElementAnimations::PushPropertiesTo(
|
| void ElementAnimations::AddAnimation(std::unique_ptr<Animation> animation) {
|
| DCHECK(!animation->is_impl_only() ||
|
| animation->target_property() == TargetProperty::SCROLL_OFFSET);
|
| - bool added_transform_animation =
|
| - animation->target_property() == TargetProperty::TRANSFORM;
|
| - bool added_opacity_animation =
|
| - animation->target_property() == TargetProperty::OPACITY;
|
| + TargetProperty::Type target_property = animation->target_property();
|
| animations_.push_back(std::move(animation));
|
| needs_to_start_animations_ = true;
|
| UpdateActivation(NORMAL_ACTIVATION);
|
| - if (added_transform_animation)
|
| - UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| - if (added_opacity_animation)
|
| - UpdateClientAnimationState(TargetProperty::OPACITY);
|
| + switch (target_property) {
|
| + case TargetProperty::TRANSFORM:
|
| + case TargetProperty::OPACITY:
|
| + case TargetProperty::FILTER:
|
| + UpdateClientAnimationState(target_property);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| }
|
|
|
| void ElementAnimations::Animate(base::TimeTicks monotonic_time) {
|
| @@ -174,6 +176,7 @@ void ElementAnimations::Animate(base::TimeTicks monotonic_time) {
|
| last_tick_time_ = monotonic_time;
|
| UpdateClientAnimationState(TargetProperty::OPACITY);
|
| UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| + UpdateClientAnimationState(TargetProperty::FILTER);
|
| }
|
|
|
| void ElementAnimations::UpdateState(bool start_ready_animations,
|
| @@ -203,6 +206,7 @@ void ElementAnimations::UpdateState(bool start_ready_animations,
|
| void ElementAnimations::ActivateAnimations() {
|
| bool changed_transform_animation = false;
|
| bool changed_opacity_animation = false;
|
| + bool changed_filter_animation = false;
|
| for (size_t i = 0; i < animations_.size(); ++i) {
|
| if (animations_[i]->affects_active_elements() !=
|
| animations_[i]->affects_pending_elements()) {
|
| @@ -210,6 +214,8 @@ void ElementAnimations::ActivateAnimations() {
|
| changed_transform_animation = true;
|
| else if (animations_[i]->target_property() == TargetProperty::OPACITY)
|
| changed_opacity_animation = true;
|
| + else if (animations_[i]->target_property() == TargetProperty::FILTER)
|
| + changed_filter_animation = true;
|
| }
|
| animations_[i]->set_affects_active_elements(
|
| animations_[i]->affects_pending_elements());
|
| @@ -227,6 +233,8 @@ void ElementAnimations::ActivateAnimations() {
|
| UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| if (changed_opacity_animation)
|
| UpdateClientAnimationState(TargetProperty::OPACITY);
|
| + if (changed_filter_animation)
|
| + UpdateClientAnimationState(TargetProperty::FILTER);
|
| }
|
|
|
| void ElementAnimations::NotifyAnimationStarted(const AnimationEvent& event) {
|
| @@ -282,8 +290,6 @@ void ElementAnimations::NotifyAnimationTakeover(const AnimationEvent& event) {
|
| }
|
|
|
| void ElementAnimations::NotifyAnimationAborted(const AnimationEvent& event) {
|
| - bool aborted_transform_animation = false;
|
| - bool aborted_opacity_animation = false;
|
| for (size_t i = 0; i < animations_.size(); ++i) {
|
| if (animations_[i]->group() == event.group_id &&
|
| animations_[i]->target_property() == event.target_property) {
|
| @@ -291,17 +297,18 @@ void ElementAnimations::NotifyAnimationAborted(const AnimationEvent& event) {
|
| animations_[i]->set_received_finished_event(true);
|
| NotifyPlayersAnimationAborted(event.monotonic_time, event.target_property,
|
| event.group_id);
|
| - if (event.target_property == TargetProperty::TRANSFORM)
|
| - aborted_transform_animation = true;
|
| - else if (event.target_property == TargetProperty::OPACITY)
|
| - aborted_opacity_animation = true;
|
| break;
|
| }
|
| }
|
| - if (aborted_transform_animation)
|
| - UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| - if (aborted_opacity_animation)
|
| - UpdateClientAnimationState(TargetProperty::OPACITY);
|
| + switch (event.target_property) {
|
| + case TargetProperty::TRANSFORM:
|
| + case TargetProperty::OPACITY:
|
| + case TargetProperty::FILTER:
|
| + UpdateClientAnimationState(event.target_property);
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| }
|
|
|
| void ElementAnimations::NotifyAnimationPropertyUpdate(
|
| @@ -560,6 +567,7 @@ void ElementAnimations::RemoveAnimationsCompletedOnMainThread(
|
| ElementAnimations* element_animations_impl) const {
|
| bool removed_transform_animation = false;
|
| bool removed_opacity_animation = false;
|
| + bool removed_filter_animation = false;
|
| // Animations removed on the main thread should no longer affect pending
|
| // elements, and should stop affecting active elements after the next call
|
| // to ActivateAnimations. If already WAITING_FOR_DELETION, they can be removed
|
| @@ -572,6 +580,8 @@ void ElementAnimations::RemoveAnimationsCompletedOnMainThread(
|
| removed_transform_animation = true;
|
| else if (animation->target_property() == TargetProperty::OPACITY)
|
| removed_opacity_animation = true;
|
| + else if (animation->target_property() == TargetProperty::FILTER)
|
| + removed_filter_animation = true;
|
| }
|
| }
|
| auto affects_active_only_and_is_waiting_for_deletion =
|
| @@ -584,12 +594,17 @@ void ElementAnimations::RemoveAnimationsCompletedOnMainThread(
|
| affects_active_only_and_is_waiting_for_deletion),
|
| animations.end());
|
|
|
| - if (removed_transform_animation)
|
| + if (removed_transform_animation) {
|
| element_animations_impl->UpdateClientAnimationState(
|
| TargetProperty::TRANSFORM);
|
| - if (removed_opacity_animation)
|
| + }
|
| + if (removed_opacity_animation) {
|
| element_animations_impl->UpdateClientAnimationState(
|
| TargetProperty::OPACITY);
|
| + }
|
| + if (removed_filter_animation) {
|
| + element_animations_impl->UpdateClientAnimationState(TargetProperty::FILTER);
|
| + }
|
| }
|
|
|
| void ElementAnimations::PushPropertiesToImplThread(
|
| @@ -733,6 +748,7 @@ void ElementAnimations::PromoteStartedAnimations(base::TimeTicks monotonic_time,
|
| void ElementAnimations::MarkFinishedAnimations(base::TimeTicks monotonic_time) {
|
| bool finished_transform_animation = false;
|
| bool finished_opacity_animation = false;
|
| + bool finished_filter_animation = false;
|
| for (size_t i = 0; i < animations_.size(); ++i) {
|
| if (!animations_[i]->is_finished() &&
|
| animations_[i]->IsFinishedAt(monotonic_time)) {
|
| @@ -741,12 +757,16 @@ void ElementAnimations::MarkFinishedAnimations(base::TimeTicks monotonic_time) {
|
| finished_transform_animation = true;
|
| else if (animations_[i]->target_property() == TargetProperty::OPACITY)
|
| finished_opacity_animation = true;
|
| + else if (animations_[i]->target_property() == TargetProperty::FILTER)
|
| + finished_filter_animation = true;
|
| }
|
| }
|
| if (finished_transform_animation)
|
| UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| if (finished_opacity_animation)
|
| UpdateClientAnimationState(TargetProperty::OPACITY);
|
| + if (finished_filter_animation)
|
| + UpdateClientAnimationState(TargetProperty::FILTER);
|
| }
|
|
|
| void ElementAnimations::MarkAnimationsForDeletion(
|
| @@ -879,6 +899,7 @@ void ElementAnimations::MarkAbortedAnimationsForDeletion(
|
| ElementAnimations* element_animations_impl) const {
|
| bool aborted_transform_animation = false;
|
| bool aborted_opacity_animation = false;
|
| + bool aborted_filter_animation = false;
|
| auto& animations_impl = element_animations_impl->animations_;
|
| for (const auto& animation_impl : animations_impl) {
|
| // If the animation has been aborted on the main thread, mark it for
|
| @@ -893,16 +914,23 @@ void ElementAnimations::MarkAbortedAnimationsForDeletion(
|
| aborted_transform_animation = true;
|
| else if (animation_impl->target_property() == TargetProperty::OPACITY)
|
| aborted_opacity_animation = true;
|
| + else if (animation_impl->target_property() == TargetProperty::FILTER)
|
| + aborted_filter_animation = true;
|
| }
|
| }
|
| }
|
|
|
| - if (aborted_transform_animation)
|
| + if (aborted_transform_animation) {
|
| element_animations_impl->UpdateClientAnimationState(
|
| TargetProperty::TRANSFORM);
|
| - if (aborted_opacity_animation)
|
| + }
|
| + if (aborted_opacity_animation) {
|
| element_animations_impl->UpdateClientAnimationState(
|
| TargetProperty::OPACITY);
|
| + }
|
| + if (aborted_filter_animation) {
|
| + element_animations_impl->UpdateClientAnimationState(TargetProperty::FILTER);
|
| + }
|
| }
|
|
|
| void ElementAnimations::PurgeAnimationsMarkedForDeletion() {
|
| @@ -1056,6 +1084,9 @@ void ElementAnimations::NotifyClientAnimationChanged(
|
| case TargetProperty::TRANSFORM:
|
| animation_state = &transform_animation_state_;
|
| break;
|
| + case TargetProperty::FILTER:
|
| + animation_state = &filter_animation_state_;
|
| + break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| @@ -1100,6 +1131,9 @@ void ElementAnimations::UpdateClientAnimationState(
|
| case TargetProperty::TRANSFORM:
|
| animation_state = &transform_animation_state_;
|
| break;
|
| + case TargetProperty::FILTER:
|
| + animation_state = &filter_animation_state_;
|
| + break;
|
| default:
|
| NOTREACHED();
|
| break;
|
| @@ -1218,6 +1252,7 @@ void ElementAnimations::PauseAnimation(int animation_id,
|
| void ElementAnimations::RemoveAnimation(int animation_id) {
|
| bool removed_transform_animation = false;
|
| bool removed_opacity_animation = false;
|
| + bool removed_filter_animation = false;
|
| // Since we want to use the animations that we're going to remove, we need to
|
| // use a stable_parition here instead of remove_if. Remove_if leaves the
|
| // removed items in an unspecified state.
|
| @@ -1235,6 +1270,9 @@ void ElementAnimations::RemoveAnimation(int animation_id) {
|
| } else if ((*it)->target_property() == TargetProperty::OPACITY &&
|
| !(*it)->is_finished()) {
|
| removed_opacity_animation = true;
|
| + } else if ((*it)->target_property() == TargetProperty::FILTER &&
|
| + !(*it)->is_finished()) {
|
| + removed_filter_animation = true;
|
| }
|
| }
|
|
|
| @@ -1244,24 +1282,25 @@ void ElementAnimations::RemoveAnimation(int animation_id) {
|
| UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| if (removed_opacity_animation)
|
| UpdateClientAnimationState(TargetProperty::OPACITY);
|
| + if (removed_filter_animation)
|
| + UpdateClientAnimationState(TargetProperty::FILTER);
|
| }
|
|
|
| void ElementAnimations::AbortAnimation(int animation_id) {
|
| - bool aborted_transform_animation = false;
|
| - bool aborted_opacity_animation = false;
|
| if (Animation* animation = GetAnimationById(animation_id)) {
|
| if (!animation->is_finished()) {
|
| animation->SetRunState(Animation::ABORTED, last_tick_time_);
|
| - if (animation->target_property() == TargetProperty::TRANSFORM)
|
| - aborted_transform_animation = true;
|
| - else if (animation->target_property() == TargetProperty::OPACITY)
|
| - aborted_opacity_animation = true;
|
| + switch (animation->target_property()) {
|
| + case TargetProperty::TRANSFORM:
|
| + case TargetProperty::OPACITY:
|
| + case TargetProperty::FILTER:
|
| + UpdateClientAnimationState(animation->target_property());
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| }
|
| }
|
| - if (aborted_transform_animation)
|
| - UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| - if (aborted_opacity_animation)
|
| - UpdateClientAnimationState(TargetProperty::OPACITY);
|
| }
|
|
|
| void ElementAnimations::AbortAnimations(TargetProperty::Type target_property,
|
| @@ -1269,8 +1308,7 @@ void ElementAnimations::AbortAnimations(TargetProperty::Type target_property,
|
| if (needs_completion)
|
| DCHECK(target_property == TargetProperty::SCROLL_OFFSET);
|
|
|
| - bool aborted_transform_animation = false;
|
| - bool aborted_opacity_animation = false;
|
| + bool aborted_animation = false;
|
| for (size_t i = 0; i < animations_.size(); ++i) {
|
| if (animations_[i]->target_property() == target_property &&
|
| !animations_[i]->is_finished()) {
|
| @@ -1282,16 +1320,20 @@ void ElementAnimations::AbortAnimations(TargetProperty::Type target_property,
|
| } else {
|
| animations_[i]->SetRunState(Animation::ABORTED, last_tick_time_);
|
| }
|
| - if (target_property == TargetProperty::TRANSFORM)
|
| - aborted_transform_animation = true;
|
| - else if (target_property == TargetProperty::OPACITY)
|
| - aborted_opacity_animation = true;
|
| + aborted_animation = true;
|
| + }
|
| + }
|
| + if (aborted_animation) {
|
| + switch (target_property) {
|
| + case TargetProperty::TRANSFORM:
|
| + case TargetProperty::OPACITY:
|
| + case TargetProperty::FILTER:
|
| + UpdateClientAnimationState(target_property);
|
| + break;
|
| + default:
|
| + break;
|
| }
|
| }
|
| - if (aborted_transform_animation)
|
| - UpdateClientAnimationState(TargetProperty::TRANSFORM);
|
| - if (aborted_opacity_animation)
|
| - UpdateClientAnimationState(TargetProperty::OPACITY);
|
| }
|
|
|
| Animation* ElementAnimations::GetAnimation(
|
| @@ -1376,6 +1418,12 @@ void ElementAnimations::IsAnimatingChanged(ElementListType list_type,
|
| ->ElementTransformIsAnimatingChanged(element_id(), list_type,
|
| change_type, is_animating);
|
| break;
|
| + case TargetProperty::FILTER:
|
| + animation_host()
|
| + ->mutator_host_client()
|
| + ->ElementFilterIsAnimatingChanged(element_id(), list_type,
|
| + change_type, is_animating);
|
| + break;
|
| default:
|
| NOTREACHED();
|
| break;
|
|
|