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

Unified Diff: cc/animation/element_animations.cc

Issue 2357533002: CC Animation: Use std::bitset to update animation state. (Closed)
Patch Set: Clean it up. Created 4 years, 3 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 eaf0890812c5c74a79f27f4a7d5e0486d3392179..31f7f25a1a8180ef1bb2cdf1457a92abc1188489 100644
--- a/cc/animation/element_animations.cc
+++ b/cc/animation/element_animations.cc
@@ -32,7 +32,6 @@ ElementAnimations::ElementAnimations()
has_element_in_pending_list_(false),
scroll_offset_animation_was_interrupted_(false),
needs_push_properties_(false) {
- ClearNeedsUpdateImplClientState();
}
ElementAnimations::~ElementAnimations() {}
@@ -62,22 +61,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,10 +150,8 @@ void ElementAnimations::PushPropertiesTo(
// 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();
+ needs_update_impl_client_state_properties_);
+ needs_update_impl_client_state_properties_.reset();
element_animations_impl->UpdateActivation(ActivationType::NORMAL);
UpdateActivation(ActivationType::NORMAL);
@@ -151,27 +159,15 @@ void ElementAnimations::PushPropertiesTo(
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;
- }
+ TargetProperties properties;
+ properties[target_property] = true;
+ UpdateClientAnimationState(properties);
}
-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::UpdateClientAnimationState(
+ TargetProperties target_properties) {
+ TargetProperties allowed_properties = GetPropertiesMaskForAnimationState();
+ UpdateClientAnimationStateInternal(target_properties & allowed_properties);
}
void ElementAnimations::AddAnimation(std::unique_ptr<Animation> animation) {
@@ -200,9 +196,8 @@ void ElementAnimations::Animate(base::TimeTicks monotonic_time) {
last_tick_time_ = monotonic_time;
- UpdateClientAnimationStateInternal(TargetProperty::OPACITY);
- UpdateClientAnimationStateInternal(TargetProperty::TRANSFORM);
- UpdateClientAnimationStateInternal(TargetProperty::FILTER);
+ TargetProperties update_properties = GetPropertiesMaskForAnimationState();
+ UpdateClientAnimationStateInternal(update_properties);
}
void ElementAnimations::UpdateState(bool start_ready_animations,
@@ -239,21 +234,16 @@ 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;
+ TargetProperties activated_properties;
for (auto& player : players_list_) {
- player.ActivateAnimations(&changed_transform_animation,
- &changed_opacity_animation,
- &changed_filter_animation);
+ TargetProperties player_activated_properties = player.ActivateAnimations();
+ activated_properties |= player_activated_properties;
}
scroll_offset_animation_was_interrupted_ = false;
UpdateActivation(ActivationType::NORMAL);
- UpdateClientAnimationState(changed_transform_animation,
- changed_opacity_animation,
- changed_filter_animation);
+ UpdateClientAnimationState(activated_properties);
}
void ElementAnimations::NotifyAnimationStarted(const AnimationEvent& event) {
@@ -404,28 +394,14 @@ 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;
+void ElementAnimations::SetNeedsUpdateImplClientState(
+ TargetProperties target_properties) {
+ needs_update_impl_client_state_properties_ |= target_properties;
- if (needs_update_impl_client_state_transform_ ||
- needs_update_impl_client_state_opacity_ ||
- needs_update_impl_client_state_filter_)
+ if (needs_update_impl_client_state_properties_.any())
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::UpdateActivation(ActivationType type) {
bool force = type == ActivationType::FORCE;
if (animation_host_) {
@@ -494,99 +470,51 @@ 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;
- }
-
- 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;
- }
+ TargetProperties properties) {
loyso (OOO) 2016/09/22 00:47:29 Just realized last night that |properties| paramet
+ if (!properties.any())
+ return;
+ if (!element_id())
+ return;
+ DCHECK(animation_host());
+ if (!animation_host()->mutator_host_client())
+ return;
+
+ 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();
for (auto& player : players_list_) {
- 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;
- PropertyAnimationState diff_state = previous_state ^ *animation_state;
+ pending_state_ &= allowed_state;
+ active_state_ &= allowed_state;
- 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);
+ DCHECK(pending_state_.IsValid());
+ DCHECK(active_state_.IsValid());
+
+ 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 {
@@ -718,40 +646,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