| Index: ui/gfx/compositor/layer_animator.h
|
| diff --git a/ui/gfx/compositor/layer_animator.h b/ui/gfx/compositor/layer_animator.h
|
| index 52b8870b66c4ddb43faa696f24652619ac704617..a51079c46a8e205e73c5fa94eea84aa01c2fced0 100644
|
| --- a/ui/gfx/compositor/layer_animator.h
|
| +++ b/ui/gfx/compositor/layer_animator.h
|
| @@ -6,119 +6,200 @@
|
| #define UI_GFX_COMPOSITOR_LAYER_ANIMATOR_H_
|
| #pragma once
|
|
|
| -#include <map>
|
| +#include <deque>
|
| +#include <vector>
|
|
|
| -#include "base/basictypes.h"
|
| -#include "base/compiler_specific.h"
|
| +#include "base/memory/linked_ptr.h"
|
| #include "base/memory/scoped_ptr.h"
|
| -#include "third_party/skia/include/core/SkScalar.h"
|
| -#include "third_party/skia/include/utils/SkMatrix44.h"
|
| -#include "ui/base/animation/animation_delegate.h"
|
| +#include "base/time.h"
|
| +#include "ui/base/animation/animation_container_element.h"
|
| #include "ui/gfx/compositor/compositor_export.h"
|
| +#include "ui/gfx/compositor/layer_animation_element.h"
|
|
|
| namespace gfx {
|
| -class Point;
|
| +class Rect;
|
| }
|
|
|
| namespace ui {
|
| -
|
| class Animation;
|
| class Layer;
|
| -class LayerAnimatorDelegate;
|
| +class LayerAnimationSequence;
|
| class Transform;
|
|
|
| -// LayerAnimator manages animating various properties of a Layer.
|
| -class COMPOSITOR_EXPORT LayerAnimator : public ui::AnimationDelegate {
|
| +// When a property of layer needs to be changed it is set by way of
|
| +// LayerAnimator. This enables LayerAnimator to animate property
|
| +// changes.
|
| +class COMPOSITOR_EXPORT LayerAnimator : public AnimationContainerElement {
|
| public:
|
| - // Types of properties that can be animated.
|
| - enum AnimationProperty {
|
| - LOCATION,
|
| - OPACITY,
|
| - TRANSFORM,
|
| + enum PreemptionStrategy {
|
| + IMMEDIATELY_SET_NEW_TARGET,
|
| + IMMEDIATELY_ANIMATE_TO_NEW_TARGET,
|
| + ENQUEUE_NEW_ANIMATION,
|
| + REPLACE_QUEUED_ANIMATIONS,
|
| + BLEND_WITH_CURRENT_ANIMATION
|
| };
|
|
|
| - explicit LayerAnimator(Layer* layer);
|
| + explicit LayerAnimator(base::TimeDelta transition_duration);
|
| virtual ~LayerAnimator();
|
|
|
| - // Sets the animation to use. LayerAnimator takes ownership of the animation.
|
| - void SetAnimation(Animation* animation);
|
| + // No implicit animations when properties are set.
|
| + static LayerAnimator* CreateDefaultAnimator();
|
| +
|
| + // Implicitly animates when properties are set.
|
| + static LayerAnimator* CreateImplicitAnimator();
|
| +
|
| + // Sets the transform on the delegate. May cause an implicit animation.
|
| + virtual void SetTransform(const Transform& transform);
|
| +
|
| + // Sets the bounds on the delegate. May cause an implicit animation.
|
| + virtual void SetBounds(const gfx::Rect& bounds);
|
| +
|
| + // Sets the opacity on the delegate. May cause an implicit animation.
|
| + virtual void SetOpacity(float opacity);
|
| +
|
| + // Sets the layer animation delegate the animator is associated with. The
|
| + // animator does not own the delegate.
|
| + void SetDelegate(LayerAnimationDelegate* delegate);
|
|
|
| - ui::Layer* layer() { return layer_; }
|
| + // Sets the animation preemption strategy. This determines the behaviour if
|
| + // a property is set during an animation. The default is
|
| + // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below).
|
| + void set_preemption_strategy(PreemptionStrategy strategy) {
|
| + preemption_strategy_ = strategy;
|
| + }
|
|
|
| - // Animates the layer to the specified point. The point is relative to the
|
| - // parent layer.
|
| - void AnimateToPoint(const gfx::Point& target);
|
| + // Start an animation sequence. If an animation for the same property is in
|
| + // progress, it needs to be interrupted with the new animation. The animator
|
| + // takes ownership of this animation sequence.
|
| + void StartAnimation(LayerAnimationSequence* animation);
|
|
|
| - // Animates the transform from the current transform to |transform|.
|
| - void AnimateTransform(const Transform& transform);
|
| + // Schedule an animation to be run when possible. The animator takes ownership
|
| + // of this animation sequence.
|
| + void ScheduleAnimation(LayerAnimationSequence* animation);
|
|
|
| - // Animates the opacity from the current opacity to |target_opacity|.
|
| - void AnimateOpacity(float target_opacity);
|
| + // Schedules the animations to be run together. Obviously will no work if
|
| + // they animate any common properties. The animator takes ownership of the
|
| + // animation sequences.
|
| + void ScheduleTogether(const std::vector<LayerAnimationSequence*>& animations);
|
|
|
| - // Returns the target value for the specified type. If the specified property
|
| - // is not animating, the current value is returned.
|
| - gfx::Point GetTargetPoint();
|
| - float GetTargetOpacity();
|
| - ui::Transform GetTargetTransform();
|
| + // Returns true if there is an animation in the queue (animations remain in
|
| + // the queue until they complete).
|
| + bool is_animating() const { return !animation_queue_.empty(); }
|
|
|
| - // Returns true if animating |property|.
|
| - bool IsAnimating(AnimationProperty property) const;
|
| + // Stops animating the given property. No effect if there is no running
|
| + // animation for the given property. Skips to the final state of the
|
| + // animation.
|
| + void StopAnimatingProperty(
|
| + LayerAnimationElement::AnimatableProperty property);
|
|
|
| - // Returns true if the animation is running.
|
| - bool IsRunning() const;
|
| + // Stops all animation and clears any queued animations.
|
| + void StopAnimating();
|
|
|
| - // Returns true if the animation has progressed at least once since
|
| - // SetAnimation() was invoked.
|
| - bool got_initial_tick() const { return got_initial_tick_; }
|
| + // For testing purposes only.
|
| + void set_disable_timer_for_test(bool enabled) {
|
| + disable_timer_for_test_ = enabled;
|
| + }
|
| + base::TimeTicks get_last_step_time_for_test() { return last_step_time_; }
|
|
|
| - // AnimationDelegate:
|
| - virtual void AnimationProgressed(const Animation* animation) OVERRIDE;
|
| - virtual void AnimationEnded(const Animation* animation) OVERRIDE;
|
| + protected:
|
| + LayerAnimationDelegate* delegate() { return delegate_; }
|
|
|
| private:
|
| - // Parameters used when animating the location.
|
| - struct LocationParams {
|
| - int start_x;
|
| - int start_y;
|
| - int target_x;
|
| - int target_y;
|
| + // We need to keep track of the start time of every running animation.
|
| + struct RunningAnimation {
|
| + RunningAnimation(LayerAnimationSequence* sequence,
|
| + base::TimeTicks start_time)
|
| + : sequence(sequence),
|
| + start_time(start_time) {
|
| + }
|
| + LayerAnimationSequence* sequence;
|
| + base::TimeTicks start_time;
|
| };
|
|
|
| - // Parameters used when animating the transform.
|
| - struct TransformParams {
|
| - SkMScalar start[16];
|
| - SkMScalar target[16];
|
| - };
|
| + typedef std::vector<RunningAnimation> RunningAnimations;
|
| + typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue;
|
|
|
| - // Parameters used when animating the opacity.
|
| - struct OpacityParams {
|
| - float start;
|
| - float target;
|
| - };
|
| + // Implementation of AnimationContainerElement
|
| + virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE;
|
| + virtual void Step(base::TimeTicks time_now) OVERRIDE;
|
| + virtual base::TimeDelta GetTimerInterval() const OVERRIDE;
|
|
|
| - union Params {
|
| - LocationParams location;
|
| - OpacityParams opacity;
|
| - TransformParams transform;
|
| - };
|
| + // Starts or stops stepping depending on whether thare are running animations.
|
| + void UpdateAnimationState();
|
| +
|
| + // Removes the sequences from both the running animations and the queue.
|
| + void RemoveAnimation(LayerAnimationSequence* sequence);
|
| +
|
| + // Progresses to the end of the sequence before removing it.
|
| + void FinishAnimation(LayerAnimationSequence* sequence);
|
| +
|
| + // Finishes any running animation with zero duration.
|
| + void FinishAnyAnimationWithZeroDuration();
|
| +
|
| + // Clears the running animations and the queue. No sequences are progressed.
|
| + void ClearAnimations();
|
| +
|
| + // Returns the running animation animating the given property, if any.
|
| + RunningAnimation* GetRunningAnimation(
|
| + LayerAnimationElement::AnimatableProperty property);
|
| +
|
| + // Checks if the sequence has already been added to the queue and adds it
|
| + // to the front if note.
|
| + void AddToQueueIfNotPresent(LayerAnimationSequence* sequence);
|
| +
|
| + // Any running or queued animation that affects a property in common with
|
| + // |sequence| is either finished or aborted depending on |abort|.
|
| + void RemoveAllAnimationsWithACommonProperty(LayerAnimationSequence* sequence,
|
| + bool abort);
|
| +
|
| + // Preempts a running animation by progressing both the running animation and
|
| + // the given sequence to the end.
|
| + void ImmediatelySetNewTarget(LayerAnimationSequence* sequence);
|
| +
|
| + // Preempts by aborting the running animation, and starts the given animation.
|
| + void ImmediatelyAnimateToNewTarget(LayerAnimationSequence* sequence);
|
| +
|
| + // Preempts by adding the new animation to the queue.
|
| + void EnqueueNewAnimation(LayerAnimationSequence* sequence);
|
| +
|
| + // Preempts by wiping out any unstarted animation in the queue and then
|
| + // enqueuing this animation.
|
| + void ReplaceQueuedAnimations(LayerAnimationSequence* sequence);
|
| +
|
| + // If there's an animation in the queue that doesn't animate the same property
|
| + // as a running animation, or an animation schedule to run before it, start it
|
| + // up. Repeat until there are no such animations.
|
| + void ProcessQueue();
|
| +
|
| + // Attempts to add the sequence to the list of running animations. Returns
|
| + // false if there is an animation running that already animates one of the
|
| + // properties affected by |sequence|.
|
| + bool StartSequenceImmediately(LayerAnimationSequence* sequence);
|
| +
|
| + // This is the queue of animations to run.
|
| + AnimationQueue animation_queue_;
|
|
|
| - typedef std::map<AnimationProperty, Params> Elements;
|
| + // The target of all layer animations.
|
| + LayerAnimationDelegate* delegate_;
|
|
|
| - // Stops animating the specified property. This does not set the property
|
| - // being animated to its final value.
|
| - void StopAnimating(AnimationProperty property);
|
| + // The currently running animations.
|
| + RunningAnimations running_animations_;
|
|
|
| - LayerAnimatorDelegate* delegate();
|
| + // Determines how animations are replaced.
|
| + PreemptionStrategy preemption_strategy_;
|
|
|
| - // The layer.
|
| - Layer* layer_;
|
| + // The default length of animations.
|
| + base::TimeDelta transition_duration_;
|
|
|
| - // Properties being animated.
|
| - Elements elements_;
|
| + // Used for coordinating the starting of animations.
|
| + base::TimeTicks last_step_time_;
|
|
|
| - scoped_ptr<ui::Animation> animation_;
|
| + // True if we are being stepped by our container.
|
| + bool is_started_;
|
|
|
| - bool got_initial_tick_;
|
| + // This prevents the animator from automatically stepping through animations
|
| + // and allows for manual stepping.
|
| + bool disable_timer_for_test_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(LayerAnimator);
|
| };
|
|
|