| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef UI_COMPOSITOR_LAYER_ANIMATOR_H_ | 5 #ifndef UI_COMPOSITOR_LAYER_ANIMATOR_H_ |
| 6 #define UI_COMPOSITOR_LAYER_ANIMATOR_H_ | 6 #define UI_COMPOSITOR_LAYER_ANIMATOR_H_ |
| 7 | 7 |
| 8 #include <deque> | 8 #include <deque> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 27 class Layer; | 27 class Layer; |
| 28 class LayerAnimationSequence; | 28 class LayerAnimationSequence; |
| 29 class LayerAnimationDelegate; | 29 class LayerAnimationDelegate; |
| 30 class LayerAnimationObserver; | 30 class LayerAnimationObserver; |
| 31 class ScopedLayerAnimationSettings; | 31 class ScopedLayerAnimationSettings; |
| 32 class Transform; | 32 class Transform; |
| 33 | 33 |
| 34 // When a property of layer needs to be changed it is set by way of | 34 // When a property of layer needs to be changed it is set by way of |
| 35 // LayerAnimator. This enables LayerAnimator to animate property changes. | 35 // LayerAnimator. This enables LayerAnimator to animate property changes. |
| 36 // NB: during many tests, set_disable_animations_for_test is used and causes | 36 // NB: during many tests, set_disable_animations_for_test is used and causes |
| 37 // all animations to complete immediately. The layer animation is ref counted | 37 // all animations to complete immediately. |
| 38 // so that if its owning layer is deleted (and the owning layer is only other | 38 class COMPOSITOR_EXPORT LayerAnimator : public AnimationContainerElement { |
| 39 // class that should ever hold a ref ptr to a LayerAnimator), the animator can | |
| 40 // ensure that it is not disposed of until it finishes executing. It does this | |
| 41 // by holding a reference to itself for the duration of methods for which it | |
| 42 // must guarantee that |this| is valid. | |
| 43 class COMPOSITOR_EXPORT LayerAnimator | |
| 44 : public AnimationContainerElement, public base::RefCounted<LayerAnimator> { | |
| 45 public: | 39 public: |
| 46 enum PreemptionStrategy { | 40 enum PreemptionStrategy { |
| 47 IMMEDIATELY_SET_NEW_TARGET, | 41 IMMEDIATELY_SET_NEW_TARGET, |
| 48 IMMEDIATELY_ANIMATE_TO_NEW_TARGET, | 42 IMMEDIATELY_ANIMATE_TO_NEW_TARGET, |
| 49 ENQUEUE_NEW_ANIMATION, | 43 ENQUEUE_NEW_ANIMATION, |
| 50 REPLACE_QUEUED_ANIMATIONS, | 44 REPLACE_QUEUED_ANIMATIONS, |
| 51 BLEND_WITH_CURRENT_ANIMATION | 45 BLEND_WITH_CURRENT_ANIMATION |
| 52 }; | 46 }; |
| 53 | 47 |
| 54 explicit LayerAnimator(base::TimeDelta transition_duration); | 48 explicit LayerAnimator(base::TimeDelta transition_duration); |
| 49 virtual ~LayerAnimator(); |
| 55 | 50 |
| 56 // No implicit animations when properties are set. | 51 // No implicit animations when properties are set. |
| 57 static LayerAnimator* CreateDefaultAnimator(); | 52 static LayerAnimator* CreateDefaultAnimator(); |
| 58 | 53 |
| 59 // Implicitly animates when properties are set. | 54 // Implicitly animates when properties are set. |
| 60 static LayerAnimator* CreateImplicitAnimator(); | 55 static LayerAnimator* CreateImplicitAnimator(); |
| 61 | 56 |
| 62 // Sets the transform on the delegate. May cause an implicit animation. | 57 // Sets the transform on the delegate. May cause an implicit animation. |
| 63 virtual void SetTransform(const Transform& transform); | 58 virtual void SetTransform(const Transform& transform); |
| 64 Transform GetTargetTransform() const; | 59 Transform GetTargetTransform() const; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 77 | 72 |
| 78 // Sets the brightness on the delegate. May cause an implicit animation. | 73 // Sets the brightness on the delegate. May cause an implicit animation. |
| 79 virtual void SetBrightness(float brightness); | 74 virtual void SetBrightness(float brightness); |
| 80 float GetTargetBrightness() const; | 75 float GetTargetBrightness() const; |
| 81 | 76 |
| 82 // Sets the grayscale on the delegate. May cause an implicit animation. | 77 // Sets the grayscale on the delegate. May cause an implicit animation. |
| 83 virtual void SetGrayscale(float grayscale); | 78 virtual void SetGrayscale(float grayscale); |
| 84 float GetTargetGrayscale() const; | 79 float GetTargetGrayscale() const; |
| 85 | 80 |
| 86 // Sets the layer animation delegate the animator is associated with. The | 81 // Sets the layer animation delegate the animator is associated with. The |
| 87 // animator does not own the delegate. The layer animator expects a non-NULL | 82 // animator does not own the delegate. |
| 88 // delegate for most of its operations, so do not call any methods without | |
| 89 // a valid delegate installed. | |
| 90 void SetDelegate(LayerAnimationDelegate* delegate); | 83 void SetDelegate(LayerAnimationDelegate* delegate); |
| 91 | 84 |
| 92 // Sets the animation preemption strategy. This determines the behaviour if | 85 // Sets the animation preemption strategy. This determines the behaviour if |
| 93 // a property is set during an animation. The default is | 86 // a property is set during an animation. The default is |
| 94 // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below). | 87 // IMMEDIATELY_SET_NEW_TARGET (see ImmediatelySetNewTarget below). |
| 95 void set_preemption_strategy(PreemptionStrategy strategy) { | 88 void set_preemption_strategy(PreemptionStrategy strategy) { |
| 96 preemption_strategy_ = strategy; | 89 preemption_strategy_ = strategy; |
| 97 } | 90 } |
| 98 | 91 |
| 99 PreemptionStrategy preemption_strategy() const { | 92 PreemptionStrategy preemption_strategy() const { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 // When set to true, all animations complete immediately. | 167 // When set to true, all animations complete immediately. |
| 175 static void set_disable_animations_for_test(bool disable_animations) { | 168 static void set_disable_animations_for_test(bool disable_animations) { |
| 176 disable_animations_for_test_ = disable_animations; | 169 disable_animations_for_test_ = disable_animations; |
| 177 } | 170 } |
| 178 | 171 |
| 179 static bool disable_animations_for_test() { | 172 static bool disable_animations_for_test() { |
| 180 return disable_animations_for_test_; | 173 return disable_animations_for_test_; |
| 181 } | 174 } |
| 182 | 175 |
| 183 protected: | 176 protected: |
| 184 virtual ~LayerAnimator(); | |
| 185 | |
| 186 LayerAnimationDelegate* delegate() { return delegate_; } | 177 LayerAnimationDelegate* delegate() { return delegate_; } |
| 187 const LayerAnimationDelegate* delegate() const { return delegate_; } | 178 const LayerAnimationDelegate* delegate() const { return delegate_; } |
| 188 | 179 |
| 189 // Virtual for testing. | 180 // Virtual for testing. |
| 190 virtual void ProgressAnimation(LayerAnimationSequence* sequence, | 181 virtual bool ProgressAnimation(LayerAnimationSequence* sequence, |
| 191 base::TimeDelta delta); | 182 base::TimeDelta delta); |
| 192 | 183 |
| 193 // Returns true if the sequence is owned by this animator. | 184 // Returns true if the sequence is owned by this animator. |
| 194 bool HasAnimation(LayerAnimationSequence* sequence) const; | 185 bool HasAnimation(LayerAnimationSequence* sequence) const; |
| 195 | 186 |
| 196 private: | 187 private: |
| 197 friend class base::RefCounted<LayerAnimator>; | |
| 198 friend class ScopedLayerAnimationSettings; | 188 friend class ScopedLayerAnimationSettings; |
| 199 | 189 |
| 190 class DestroyedTracker; |
| 191 |
| 192 // Used by FinishAnimation() to indicate if this has been destroyed. |
| 193 enum DestroyedType { |
| 194 DESTROYED, |
| 195 NOT_DESTROYED, |
| 196 }; |
| 197 |
| 200 // We need to keep track of the start time of every running animation. | 198 // We need to keep track of the start time of every running animation. |
| 201 struct RunningAnimation { | 199 struct RunningAnimation { |
| 202 RunningAnimation(LayerAnimationSequence* sequence, | 200 RunningAnimation(LayerAnimationSequence* sequence, |
| 203 base::TimeTicks start_time) | 201 base::TimeTicks start_time) |
| 204 : sequence(sequence), | 202 : sequence(sequence), |
| 205 start_time(start_time) { | 203 start_time(start_time) { |
| 206 } | 204 } |
| 207 LayerAnimationSequence* sequence; | 205 LayerAnimationSequence* sequence; |
| 208 base::TimeTicks start_time; | 206 base::TimeTicks start_time; |
| 209 }; | 207 }; |
| 210 | 208 |
| 211 typedef std::vector<RunningAnimation> RunningAnimations; | 209 typedef std::vector<RunningAnimation> RunningAnimations; |
| 212 typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue; | 210 typedef std::deque<linked_ptr<LayerAnimationSequence> > AnimationQueue; |
| 213 | 211 |
| 214 // Implementation of AnimationContainerElement | 212 // Implementation of AnimationContainerElement |
| 215 virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE; | 213 virtual void SetStartTime(base::TimeTicks start_time) OVERRIDE; |
| 216 virtual void Step(base::TimeTicks time_now) OVERRIDE; | 214 virtual void Step(base::TimeTicks time_now) OVERRIDE; |
| 217 virtual base::TimeDelta GetTimerInterval() const OVERRIDE; | 215 virtual base::TimeDelta GetTimerInterval() const OVERRIDE; |
| 218 | 216 |
| 219 // Starts or stops stepping depending on whether thare are running animations. | 217 // Starts or stops stepping depending on whether thare are running animations. |
| 220 void UpdateAnimationState(); | 218 void UpdateAnimationState(); |
| 221 | 219 |
| 222 // Removes the sequences from both the running animations and the queue. | 220 // Removes the sequences from both the running animations and the queue. |
| 223 // Returns a pointer to the removed animation, if any. NOTE: the caller is | 221 // Returns a pointer to the removed animation, if any. NOTE: the caller is |
| 224 // responsible for deleting the returned pointer. | 222 // responsible for deleting the returned pointer. |
| 225 LayerAnimationSequence* RemoveAnimation( | 223 LayerAnimationSequence* RemoveAnimation( |
| 226 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT; | 224 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT; |
| 227 | 225 |
| 228 // Progresses to the end of the sequence before removing it. | 226 // Progresses to the end of the sequence before removing it. |
| 229 void FinishAnimation(LayerAnimationSequence* sequence); | 227 DestroyedType FinishAnimation( |
| 228 LayerAnimationSequence* sequence) WARN_UNUSED_RESULT; |
| 230 | 229 |
| 231 // Finishes any running animation with zero duration. | 230 // Finishes any running animation with zero duration. |
| 232 void FinishAnyAnimationWithZeroDuration(); | 231 void FinishAnyAnimationWithZeroDuration(); |
| 233 | 232 |
| 234 // Clears the running animations and the queue. No sequences are progressed. | 233 // Clears the running animations and the queue. No sequences are progressed. |
| 235 void ClearAnimations(); | 234 void ClearAnimations(); |
| 236 | 235 |
| 237 // Returns the running animation animating the given property, if any. | 236 // Returns the running animation animating the given property, if any. |
| 238 RunningAnimation* GetRunningAnimation( | 237 RunningAnimation* GetRunningAnimation( |
| 239 LayerAnimationElement::AnimatableProperty property); | 238 LayerAnimationElement::AnimatableProperty property); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 void GetTargetValue(LayerAnimationElement::TargetValue* target) const; | 275 void GetTargetValue(LayerAnimationElement::TargetValue* target) const; |
| 277 | 276 |
| 278 // Called whenever an animation is added to the animation queue. Either by | 277 // Called whenever an animation is added to the animation queue. Either by |
| 279 // starting the animation or adding to the queue. | 278 // starting the animation or adding to the queue. |
| 280 void OnScheduled(LayerAnimationSequence* sequence); | 279 void OnScheduled(LayerAnimationSequence* sequence); |
| 281 | 280 |
| 282 // Returns the default length of animations, including adjustment for slow | 281 // Returns the default length of animations, including adjustment for slow |
| 283 // animation mode if set. | 282 // animation mode if set. |
| 284 base::TimeDelta GetTransitionDuration() const; | 283 base::TimeDelta GetTransitionDuration() const; |
| 285 | 284 |
| 286 // Clears the animation queues and notifies any running animations that they | |
| 287 // have been aborted. | |
| 288 void ClearAnimationsInternal(); | |
| 289 | |
| 290 // This is the queue of animations to run. | 285 // This is the queue of animations to run. |
| 291 AnimationQueue animation_queue_; | 286 AnimationQueue animation_queue_; |
| 292 | 287 |
| 293 // The target of all layer animations. | 288 // The target of all layer animations. |
| 294 LayerAnimationDelegate* delegate_; | 289 LayerAnimationDelegate* delegate_; |
| 295 | 290 |
| 296 // The currently running animations. | 291 // The currently running animations. |
| 297 RunningAnimations running_animations_; | 292 RunningAnimations running_animations_; |
| 298 | 293 |
| 299 // Determines how animations are replaced. | 294 // Determines how animations are replaced. |
| (...skipping 21 matching lines...) Expand all Loading... |
| 321 // Slows down all animations for visual debugging. | 316 // Slows down all animations for visual debugging. |
| 322 static bool slow_animation_mode_; | 317 static bool slow_animation_mode_; |
| 323 | 318 |
| 324 // Amount to slow animations for debugging. | 319 // Amount to slow animations for debugging. |
| 325 static int slow_animation_scale_factor_; | 320 static int slow_animation_scale_factor_; |
| 326 | 321 |
| 327 // Observers are notified when layer animations end, are scheduled or are | 322 // Observers are notified when layer animations end, are scheduled or are |
| 328 // aborted. | 323 // aborted. |
| 329 ObserverList<LayerAnimationObserver> observers_; | 324 ObserverList<LayerAnimationObserver> observers_; |
| 330 | 325 |
| 326 scoped_refptr<DestroyedTracker> destroyed_tracker_; |
| 327 |
| 331 DISALLOW_COPY_AND_ASSIGN(LayerAnimator); | 328 DISALLOW_COPY_AND_ASSIGN(LayerAnimator); |
| 332 }; | 329 }; |
| 333 | 330 |
| 334 } // namespace ui | 331 } // namespace ui |
| 335 | 332 |
| 336 #endif // UI_COMPOSITOR_LAYER_ANIMATOR_H_ | 333 #endif // UI_COMPOSITOR_LAYER_ANIMATOR_H_ |
| OLD | NEW |