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

Unified Diff: cc/animation/element_animations.h

Issue 1904653002: CC Animation: Merge LayerAnimationController into ElementAnimations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor optimization: Don't init value observations if same host. Created 4 years, 8 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/animation_player_unittest.cc ('k') | cc/animation/element_animations.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/element_animations.h
diff --git a/cc/animation/element_animations.h b/cc/animation/element_animations.h
index 4214f317ba401705ab8b371fdf2071cfd08bd6fd..51d3eb25a983587e70b7c59e436672e39f186477 100644
--- a/cc/animation/element_animations.h
+++ b/cc/animation/element_animations.h
@@ -5,66 +5,60 @@
#ifndef CC_ANIMATION_ELEMENT_ANIMATIONS_H_
#define CC_ANIMATION_ELEMENT_ANIMATIONS_H_
+#include <bitset>
#include <memory>
+#include <vector>
#include "base/containers/linked_list.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
+#include "cc/animation/animation.h"
#include "cc/animation/animation_curve.h"
-#include "cc/animation/animation_delegate.h"
-#include "cc/animation/layer_animation_controller.h"
-#include "cc/animation/layer_animation_value_observer.h"
-#include "cc/animation/layer_animation_value_provider.h"
+#include "cc/animation/animation_events.h"
+#include "cc/animation/target_property.h"
#include "cc/base/cc_export.h"
+#include "ui/gfx/geometry/scroll_offset.h"
+#include "ui/gfx/transform.h"
namespace gfx {
-class ScrollOffset;
-class Transform;
+class BoxF;
}
namespace cc {
+class AnimationDelegate;
+class AnimationEvents;
class AnimationHost;
class AnimationPlayer;
class FilterOperations;
-class LayerAnimationController;
+class KeyframeValueList;
enum class LayerTreeType;
// An ElementAnimations owns a list of all AnimationPlayers, attached to
-// the layer. Also, it owns LayerAnimationController instance (1:1
-// relationship)
-// ElementAnimations object redirects all events from LAC to the list
-// of animation layers.
+// the layer.
// This is a CC counterpart for blink::ElementAnimations (in 1:1 relationship).
// No pointer to/from respective blink::ElementAnimations object for now.
-class CC_EXPORT ElementAnimations : public base::RefCounted<ElementAnimations>,
- public AnimationDelegate,
- public LayerAnimationValueObserver,
- public LayerAnimationValueProvider {
+class CC_EXPORT ElementAnimations : public base::RefCounted<ElementAnimations> {
public:
- static scoped_refptr<ElementAnimations> Create(AnimationHost* host);
+ enum class ObserverType { ACTIVE, PENDING };
- int layer_id() const {
- return layer_animation_controller_ ? layer_animation_controller_->id() : 0;
- }
+ static scoped_refptr<ElementAnimations> Create();
+
+ int layer_id() const { return layer_id_; }
+ void SetLayerId(int layer_id);
// Parent AnimationHost.
AnimationHost* animation_host() { return animation_host_; }
const AnimationHost* animation_host() const { return animation_host_; }
+ void SetAnimationHost(AnimationHost* host);
- void CreateLayerAnimationController(int layer_id);
- void DestroyLayerAnimationController();
+ void InitValueObservations();
+ void ClearValueObservations();
void LayerRegistered(int layer_id, LayerTreeType tree_type);
void LayerUnregistered(int layer_id, LayerTreeType tree_type);
- bool needs_active_value_observations() const {
- return layer_animation_controller_->needs_active_value_observations();
- }
- bool needs_pending_value_observations() const {
- return layer_animation_controller_->needs_pending_value_observations();
- }
-
void AddPlayer(AnimationPlayer* player);
void RemovePlayer(AnimationPlayer* player);
bool IsEmpty() const;
@@ -73,6 +67,9 @@ class CC_EXPORT ElementAnimations : public base::RefCounted<ElementAnimations>,
typedef base::LinkNode<AnimationPlayer> PlayersListNode;
const PlayersList& players_list() const { return *players_list_.get(); }
+ // Ensures that the list of active animations on the main thread and the impl
+ // thread are kept in sync. This function does not take ownership of the impl
+ // thread ElementAnimations.
void PushPropertiesTo(
scoped_refptr<ElementAnimations> element_animations_impl);
@@ -83,6 +80,17 @@ class CC_EXPORT ElementAnimations : public base::RefCounted<ElementAnimations>,
void AbortAnimations(TargetProperty::Type target_property,
bool needs_completion = false);
+ void Animate(base::TimeTicks monotonic_time);
+ void AccumulatePropertyUpdates(base::TimeTicks monotonic_time,
+ AnimationEvents* events);
+
+ void UpdateState(bool start_ready_animations, AnimationEvents* events);
+
+ // Make animations affect active observers if and only if they affect
+ // pending observers. Any animations that no longer affect any observers
+ // are deleted.
+ void ActivateAnimations();
+
// Returns the active animation animating the given property that is either
// running, or is next to run, if such an animation exists.
Animation* GetAnimation(TargetProperty::Type target_property) const;
@@ -90,56 +98,191 @@ class CC_EXPORT ElementAnimations : public base::RefCounted<ElementAnimations>,
// Returns the active animation for the given unique animation id.
Animation* GetAnimationById(int animation_id) const;
+ // Returns true if there are any animations that have neither finished nor
+ // aborted.
+ bool HasActiveAnimation() const;
+
+ // Returns true if there are any animations at all to process.
+ bool has_any_animation() const { return !animations_.empty(); }
+
+ // Returns true if there is an animation that is either currently animating
+ // the given property or scheduled to animate this property in the future, and
+ // that affects the given observer type.
+ bool IsPotentiallyAnimatingProperty(TargetProperty::Type target_property,
+ ObserverType observer_type) const;
+
+ // Returns true if there is an animation that is currently animating the given
+ // property and that affects the given observer type.
+ bool IsCurrentlyAnimatingProperty(TargetProperty::Type target_property,
+ ObserverType observer_type) const;
+
+ void NotifyAnimationStarted(const AnimationEvent& event);
+ void NotifyAnimationFinished(const AnimationEvent& event);
+ void NotifyAnimationAborted(const AnimationEvent& event);
+ void NotifyAnimationPropertyUpdate(const AnimationEvent& event);
+ void NotifyAnimationTakeover(const AnimationEvent& event);
+
+ bool needs_active_value_observations() const {
+ return needs_active_value_observations_;
+ }
+ bool needs_pending_value_observations() const {
+ return needs_pending_value_observations_;
+ }
+
+ void set_needs_active_value_observations(
+ bool needs_active_value_observations) {
+ needs_active_value_observations_ = needs_active_value_observations;
+ }
+ void set_needs_pending_value_observations(
+ bool needs_pending_value_observations) {
+ needs_pending_value_observations_ = needs_pending_value_observations;
+ }
+
+ bool HasFilterAnimationThatInflatesBounds() const;
+ bool HasTransformAnimationThatInflatesBounds() const;
+ bool HasAnimationThatInflatesBounds() const {
+ return HasTransformAnimationThatInflatesBounds() ||
+ HasFilterAnimationThatInflatesBounds();
+ }
+
+ bool FilterAnimationBoundsForBox(const gfx::BoxF& box,
+ gfx::BoxF* bounds) const;
+ bool TransformAnimationBoundsForBox(const gfx::BoxF& box,
+ gfx::BoxF* bounds) const;
+
+ bool HasAnimationThatAffectsScale() const;
+
+ bool HasOnlyTranslationTransforms(ObserverType observer_type) const;
+
+ bool AnimationsPreserveAxisAlignment() const;
+
+ // Sets |start_scale| to the maximum of starting animation scale along any
+ // dimension at any destination in active animations. Returns false if the
+ // starting scale cannot be computed.
+ bool AnimationStartScale(ObserverType observer_type,
+ float* start_scale) const;
+
+ // Sets |max_scale| to the maximum scale along any dimension at any
+ // destination in active animations. Returns false if the maximum scale cannot
+ // be computed.
+ bool MaximumTargetScale(ObserverType observer_type, float* max_scale) const;
+
+ // When a scroll animation is removed on the main thread, its compositor
+ // thread counterpart continues producing scroll deltas until activation.
+ // These scroll deltas need to be cleared at activation, so that the active
+ // layer's scroll offset matches the offset provided by the main thread
+ // rather than a combination of this offset and scroll deltas produced by
+ // the removed animation. This is to provide the illusion of synchronicity to
+ // JS that simultaneously removes an animation and sets the scroll offset.
+ bool scroll_offset_animation_was_interrupted() const {
+ return scroll_offset_animation_was_interrupted_;
+ }
+
+ bool needs_to_start_animations_for_testing() {
+ return needs_to_start_animations_;
+ }
+
private:
friend class base::RefCounted<ElementAnimations>;
- // TODO(loyso): Erase this when LAC merged into ElementAnimations.
- friend class AnimationHost;
+ ElementAnimations();
+ ~ElementAnimations();
+
+ // A set of target properties. TargetProperty must be 0-based enum.
+ using TargetProperties =
+ std::bitset<TargetProperty::LAST_TARGET_PROPERTY + 1>;
+
+ void PushNewAnimationsToImplThread(
+ ElementAnimations* element_animations_impl) const;
+ void MarkAbortedAnimationsForDeletion(
+ ElementAnimations* element_animations_impl) const;
+ void RemoveAnimationsCompletedOnMainThread(
+ ElementAnimations* element_animations_impl) const;
+ void PushPropertiesToImplThread(ElementAnimations* element_animations_impl);
+
+ void StartAnimations(base::TimeTicks monotonic_time);
+ void PromoteStartedAnimations(base::TimeTicks monotonic_time,
+ AnimationEvents* events);
+ void MarkFinishedAnimations(base::TimeTicks monotonic_time);
+ void MarkAnimationsForDeletion(base::TimeTicks monotonic_time,
+ AnimationEvents* events);
+ void PurgeAnimationsMarkedForDeletion();
+
+ void TickAnimations(base::TimeTicks monotonic_time);
- explicit ElementAnimations(AnimationHost* host);
- ~ElementAnimations() override;
+ enum UpdateActivationType { NORMAL_ACTIVATION, FORCE_ACTIVATION };
+ void UpdateActivation(UpdateActivationType type);
+
+ void NotifyObserversOpacityAnimated(float opacity,
+ bool notify_active_observers,
+ bool notify_pending_observers);
+ void NotifyObserversTransformAnimated(const gfx::Transform& transform,
+ bool notify_active_observers,
+ bool notify_pending_observers);
+ void NotifyObserversFilterAnimated(const FilterOperations& filter,
+ bool notify_active_observers,
+ bool notify_pending_observers);
+ void NotifyObserversScrollOffsetAnimated(
+ const gfx::ScrollOffset& scroll_offset,
+ bool notify_active_observers,
+ bool notify_pending_observers);
+
+ void NotifyObserversAnimationWaitingForDeletion();
+
+ void NotifyObserversTransformIsPotentiallyAnimatingChanged(
+ bool notify_active_observers,
+ bool notify_pending_observers);
+
+ void UpdatePotentiallyAnimatingTransform();
- // LayerAnimationValueObserver implementation.
void OnFilterAnimated(LayerTreeType tree_type,
- const FilterOperations& filters) override;
- void OnOpacityAnimated(LayerTreeType tree_type, float opacity) override;
+ const FilterOperations& filters);
+ void OnOpacityAnimated(LayerTreeType tree_type, float opacity);
void OnTransformAnimated(LayerTreeType tree_type,
- const gfx::Transform& transform) override;
+ const gfx::Transform& transform);
void OnScrollOffsetAnimated(LayerTreeType tree_type,
- const gfx::ScrollOffset& scroll_offset) override;
- void OnAnimationWaitingForDeletion() override;
+ const gfx::ScrollOffset& scroll_offset);
+ void OnAnimationWaitingForDeletion();
void OnTransformIsPotentiallyAnimatingChanged(LayerTreeType tree_type,
- bool is_animating) override;
-
- void CreateActiveValueObserver();
- void DestroyActiveValueObserver();
-
- void CreatePendingValueObserver();
- void DestroyPendingValueObserver();
-
- // AnimationDelegate implementation
- void NotifyAnimationStarted(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override;
- void NotifyAnimationFinished(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override;
- void NotifyAnimationAborted(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- int group) override;
- void NotifyAnimationTakeover(base::TimeTicks monotonic_time,
- TargetProperty::Type target_property,
- double animation_start_time,
- std::unique_ptr<AnimationCurve> curve) override;
-
- // LayerAnimationValueProvider implementation.
- gfx::ScrollOffset ScrollOffsetForAnimation() const override;
+ bool is_animating);
+ gfx::ScrollOffset ScrollOffsetForAnimation() const;
- std::unique_ptr<PlayersList> players_list_;
+ void NotifyPlayersAnimationStarted(base::TimeTicks monotonic_time,
+ TargetProperty::Type target_property,
+ int group);
+ void NotifyPlayersAnimationFinished(base::TimeTicks monotonic_time,
+ TargetProperty::Type target_property,
+ int group);
+ void NotifyPlayersAnimationAborted(base::TimeTicks monotonic_time,
+ TargetProperty::Type target_property,
+ int group);
+ void NotifyPlayersAnimationPropertyUpdate(const AnimationEvent& event);
+ void NotifyPlayersAnimationTakeover(base::TimeTicks monotonic_time,
+ TargetProperty::Type target_property,
+ double animation_start_time,
+ std::unique_ptr<AnimationCurve> curve);
- // LAC is owned by ElementAnimations (1:1 relationship).
- scoped_refptr<LayerAnimationController> layer_animation_controller_;
+ std::unique_ptr<PlayersList> players_list_;
AnimationHost* animation_host_;
+ int layer_id_;
+ std::vector<std::unique_ptr<Animation>> animations_;
+
+ // This is used to ensure that we don't spam the animation host.
+ bool is_active_;
+
+ base::TimeTicks last_tick_time_;
+
+ bool needs_active_value_observations_;
+ bool needs_pending_value_observations_;
+
+ // Only try to start animations when new animations are added or when the
+ // previous attempt at starting animations failed to start all animations.
+ bool needs_to_start_animations_;
+
+ bool scroll_offset_animation_was_interrupted_;
+
+ bool potentially_animating_transform_for_active_observers_;
+ bool potentially_animating_transform_for_pending_observers_;
DISALLOW_COPY_AND_ASSIGN(ElementAnimations);
};
« no previous file with comments | « cc/animation/animation_player_unittest.cc ('k') | cc/animation/element_animations.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698