Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1144)

Unified Diff: cc/animation/element_animations.cc

Issue 2357533002: CC Animation: Use std::bitset to update animation state. (Closed)
Patch Set: Reparent. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/animation/element_animations.h ('k') | cc/animation/property_animation_state.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/element_animations.cc
diff --git a/cc/animation/element_animations.cc b/cc/animation/element_animations.cc
index abcf3113a5685b2acdcba82c90ccdee252c1fc12..c50e05ea5aa617485e3a24729eeacee62e3f1cd4 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -32,9 +32,8 @@ ElementAnimations::ElementAnimations()
has_element_in_active_list_(false),
has_element_in_pending_list_(false),
scroll_offset_animation_was_interrupted_(false),
- needs_push_properties_(false) {
- ClearNeedsUpdateImplClientState();
-}
+ needs_push_properties_(false),
+ needs_update_impl_client_state_(false) {}
ElementAnimations::~ElementAnimations() {}
@@ -63,22 +62,33 @@ void ElementAnimations::InitAffectedElementTypes() {
}
}
+TargetProperties ElementAnimations::GetPropertiesMaskForAnimationState() {
+ TargetProperties properties;
+ properties[TargetProperty::TRANSFORM] = true;
+ properties[TargetProperty::OPACITY] = true;
+ properties[TargetProperty::FILTER] = true;
+ return properties;
+}
+
void ElementAnimations::ClearAffectedElementTypes() {
DCHECK(animation_host_);
+ TargetProperties disable_properties = GetPropertiesMaskForAnimationState();
+ PropertyAnimationState disabled_state_mask, disabled_state;
+ disabled_state_mask.currently_running = disable_properties;
+ disabled_state_mask.potentially_animating = disable_properties;
+
if (has_element_in_active_list()) {
- IsAnimatingChanged(ElementListType::ACTIVE, TargetProperty::TRANSFORM,
- AnimationChangeType::BOTH, false);
- IsAnimatingChanged(ElementListType::ACTIVE, TargetProperty::OPACITY,
- AnimationChangeType::BOTH, false);
+ animation_host()->mutator_host_client()->ElementIsAnimatingChanged(
+ element_id(), ElementListType::ACTIVE, disabled_state_mask,
+ disabled_state);
}
set_has_element_in_active_list(false);
if (has_element_in_pending_list()) {
- IsAnimatingChanged(ElementListType::PENDING, TargetProperty::TRANSFORM,
- AnimationChangeType::BOTH, false);
- IsAnimatingChanged(ElementListType::PENDING, TargetProperty::OPACITY,
- AnimationChangeType::BOTH, false);
+ animation_host()->mutator_host_client()->ElementIsAnimatingChanged(
+ element_id(), ElementListType::PENDING, disabled_state_mask,
+ disabled_state);
}
set_has_element_in_pending_list(false);
@@ -140,41 +150,14 @@ void ElementAnimations::PushPropertiesTo(
scroll_offset_animation_was_interrupted_ = false;
// Update impl client state.
- element_animations_impl->UpdateClientAnimationState(
- needs_update_impl_client_state_transform_,
- needs_update_impl_client_state_opacity_,
- needs_update_impl_client_state_filter_);
- ClearNeedsUpdateImplClientState();
+ if (needs_update_impl_client_state_)
+ element_animations_impl->UpdateClientAnimationState();
+ needs_update_impl_client_state_ = false;
element_animations_impl->UpdateActivation(ActivationType::NORMAL);
UpdateActivation(ActivationType::NORMAL);
}
-void ElementAnimations::UpdateClientAnimationState(
- TargetProperty::Type target_property) {
- switch (target_property) {
- case TargetProperty::TRANSFORM:
- case TargetProperty::OPACITY:
- case TargetProperty::FILTER:
- UpdateClientAnimationStateInternal(target_property);
- break;
- default:
- // Do not update for other properties.
- break;
- }
-}
-
-void ElementAnimations::UpdateClientAnimationState(bool transform,
- bool opacity,
- bool filter) {
- if (transform)
- UpdateClientAnimationStateInternal(TargetProperty::TRANSFORM);
- if (opacity)
- UpdateClientAnimationStateInternal(TargetProperty::OPACITY);
- if (filter)
- UpdateClientAnimationStateInternal(TargetProperty::FILTER);
-}
-
void ElementAnimations::AddAnimation(std::unique_ptr<Animation> animation) {
// TODO(loyso): Erase this. Rewrite element_animations_unittest to use
// AnimationPlayer::AddAnimation.
@@ -209,10 +192,7 @@ void ElementAnimations::Animate(base::TimeTicks monotonic_time) {
player->TickAnimations(monotonic_time);
}
last_tick_time_ = monotonic_time;
-
- UpdateClientAnimationStateInternal(TargetProperty::OPACITY);
- UpdateClientAnimationStateInternal(TargetProperty::TRANSFORM);
- UpdateClientAnimationStateInternal(TargetProperty::FILTER);
+ UpdateClientAnimationState();
}
void ElementAnimations::UpdateState(bool start_ready_animations,
@@ -260,23 +240,13 @@ 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;
-
ElementAnimations::PlayersList::Iterator it(players_list_.get());
AnimationPlayer* player;
- while ((player = it.GetNext()) != nullptr) {
- player->ActivateAnimations(&changed_transform_animation,
- &changed_opacity_animation,
- &changed_filter_animation);
- }
+ while ((player = it.GetNext()) != nullptr)
+ player->ActivateAnimations();
scroll_offset_animation_was_interrupted_ = false;
UpdateActivation(ActivationType::NORMAL);
- UpdateClientAnimationState(changed_transform_animation,
- changed_opacity_animation,
- changed_filter_animation);
}
void ElementAnimations::NotifyAnimationStarted(const AnimationEvent& event) {
@@ -319,7 +289,7 @@ void ElementAnimations::NotifyAnimationAborted(const AnimationEvent& event) {
break;
}
- UpdateClientAnimationState(event.target_property);
+ UpdateClientAnimationState();
}
void ElementAnimations::NotifyAnimationPropertyUpdate(
@@ -441,26 +411,9 @@ bool ElementAnimations::MaximumTargetScale(ElementListType list_type,
return true;
}
-void ElementAnimations::SetNeedsUpdateImplClientState(bool transform,
- bool opacity,
- bool filter) {
- if (transform)
- needs_update_impl_client_state_transform_ = true;
- if (opacity)
- needs_update_impl_client_state_opacity_ = true;
- if (filter)
- needs_update_impl_client_state_filter_ = true;
-
- if (needs_update_impl_client_state_transform_ ||
- needs_update_impl_client_state_opacity_ ||
- needs_update_impl_client_state_filter_)
- SetNeedsPushProperties();
-}
-
-void ElementAnimations::ClearNeedsUpdateImplClientState() {
- needs_update_impl_client_state_transform_ = false;
- needs_update_impl_client_state_opacity_ = false;
- needs_update_impl_client_state_filter_ = false;
+void ElementAnimations::SetNeedsUpdateImplClientState() {
+ needs_update_impl_client_state_ = true;
+ SetNeedsPushProperties();
}
void ElementAnimations::UpdateActivation(ActivationType type) {
@@ -533,101 +486,50 @@ void ElementAnimations::NotifyClientScrollOffsetAnimated(
OnScrollOffsetAnimated(ElementListType::PENDING, scroll_offset);
}
-void ElementAnimations::NotifyClientAnimationChanged(
- TargetProperty::Type property,
- ElementListType list_type,
- bool notify_elements_about_potential_animation,
- bool notify_elements_about_running_animation) {
- PropertyAnimationState* animation_state = nullptr;
- switch (property) {
- case TargetProperty::OPACITY:
- animation_state = &opacity_animation_state_;
- break;
- case TargetProperty::TRANSFORM:
- animation_state = &transform_animation_state_;
- break;
- case TargetProperty::FILTER:
- animation_state = &filter_animation_state_;
- break;
- default:
- NOTREACHED();
- break;
- }
+void ElementAnimations::UpdateClientAnimationState() {
+ if (!element_id())
+ return;
+ DCHECK(animation_host());
+ if (!animation_host()->mutator_host_client())
+ return;
- bool notify_elements_about_potential_and_running_animation =
- notify_elements_about_potential_animation &&
- notify_elements_about_running_animation;
- bool active = list_type == ElementListType::ACTIVE;
- if (notify_elements_about_potential_and_running_animation) {
- bool potentially_animating =
- active ? animation_state->potentially_animating_for_active_elements
- : animation_state->potentially_animating_for_pending_elements;
- bool currently_animating =
- active ? animation_state->currently_running_for_active_elements
- : animation_state->currently_running_for_pending_elements;
- DCHECK_EQ(potentially_animating, currently_animating);
- IsAnimatingChanged(list_type, property, AnimationChangeType::BOTH,
- potentially_animating);
- } else if (notify_elements_about_potential_animation) {
- bool potentially_animating =
- active ? animation_state->potentially_animating_for_active_elements
- : animation_state->potentially_animating_for_pending_elements;
- IsAnimatingChanged(list_type, property, AnimationChangeType::POTENTIAL,
- potentially_animating);
- } else if (notify_elements_about_running_animation) {
- bool currently_animating =
- active ? animation_state->currently_running_for_active_elements
- : animation_state->currently_running_for_pending_elements;
- IsAnimatingChanged(list_type, property, AnimationChangeType::RUNNING,
- currently_animating);
- }
-}
-
-void ElementAnimations::UpdateClientAnimationStateInternal(
- TargetProperty::Type property) {
- PropertyAnimationState* animation_state = nullptr;
- switch (property) {
- case TargetProperty::OPACITY:
- animation_state = &opacity_animation_state_;
- break;
- case TargetProperty::TRANSFORM:
- animation_state = &transform_animation_state_;
- break;
- case TargetProperty::FILTER:
- animation_state = &filter_animation_state_;
- break;
- default:
- NOTREACHED();
- break;
- }
+ PropertyAnimationState prev_pending = pending_state_;
+ PropertyAnimationState prev_active = active_state_;
- PropertyAnimationState previous_state = *animation_state;
- animation_state->Clear();
- DCHECK(previous_state.IsValid());
+ pending_state_.Clear();
+ active_state_.Clear();
ElementAnimations::PlayersList::Iterator it(players_list_.get());
AnimationPlayer* player;
while ((player = it.GetNext()) != nullptr) {
- PropertyAnimationState player_state;
- player->GetPropertyAnimationStateFor(property, &player_state);
- *animation_state |= player_state;
+ PropertyAnimationState player_pending_state, player_active_state;
+ player->GetPropertyAnimationState(&player_pending_state,
+ &player_active_state);
+ pending_state_ |= player_pending_state;
+ active_state_ |= player_active_state;
}
- if (*animation_state == previous_state)
- return;
+ TargetProperties allowed_properties = GetPropertiesMaskForAnimationState();
+ PropertyAnimationState allowed_state;
+ allowed_state.currently_running = allowed_properties;
+ allowed_state.potentially_animating = allowed_properties;
+
+ pending_state_ &= allowed_state;
+ active_state_ &= allowed_state;
- PropertyAnimationState diff_state = previous_state ^ *animation_state;
+ DCHECK(pending_state_.IsValid());
+ DCHECK(active_state_.IsValid());
- if (has_element_in_active_list())
- NotifyClientAnimationChanged(
- property, ElementListType::ACTIVE,
- diff_state.potentially_animating_for_active_elements,
- diff_state.currently_running_for_active_elements);
- if (has_element_in_pending_list())
- NotifyClientAnimationChanged(
- property, ElementListType::PENDING,
- diff_state.potentially_animating_for_pending_elements,
- diff_state.currently_running_for_pending_elements);
+ if (has_element_in_active_list() && prev_active != active_state_) {
+ PropertyAnimationState diff_active = prev_active ^ active_state_;
+ animation_host()->mutator_host_client()->ElementIsAnimatingChanged(
+ element_id(), ElementListType::ACTIVE, diff_active, active_state_);
+ }
+ if (has_element_in_pending_list() && prev_pending != pending_state_) {
+ PropertyAnimationState diff_pending = prev_pending ^ pending_state_;
+ animation_host()->mutator_host_client()->ElementIsAnimatingChanged(
+ element_id(), ElementListType::PENDING, diff_pending, pending_state_);
+ }
}
bool ElementAnimations::HasActiveAnimation() const {
@@ -781,40 +683,6 @@ void ElementAnimations::OnScrollOffsetAnimated(
element_id(), list_type, scroll_offset);
}
-void ElementAnimations::IsAnimatingChanged(ElementListType list_type,
- TargetProperty::Type property,
- AnimationChangeType change_type,
- bool is_animating) {
- if (!element_id())
- return;
- DCHECK(animation_host());
- if (animation_host()->mutator_host_client()) {
- switch (property) {
- case TargetProperty::OPACITY:
- animation_host()
- ->mutator_host_client()
- ->ElementOpacityIsAnimatingChanged(element_id(), list_type,
- change_type, is_animating);
- break;
- case TargetProperty::TRANSFORM:
- animation_host()
- ->mutator_host_client()
- ->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;
- }
- }
-}
-
gfx::ScrollOffset ElementAnimations::ScrollOffsetForAnimation() const {
if (animation_host()) {
DCHECK(animation_host()->mutator_host_client());
« no previous file with comments | « cc/animation/element_animations.h ('k') | cc/animation/property_animation_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698