layer_animation_sequence.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <vector> 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/gtest_prod_util.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/linked_ptr.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/observer_list.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/time/time.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/compositor/compositor_export.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace ui { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class LayerAnimationDelegate; 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass LayerAnimationObserver; 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Contains a collection of layer animation elements to be played one after 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// another. Although it has a similar interface to LayerAnimationElement, it is 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// not a LayerAnimationElement (i.e., it is not permitted to have a sequence in 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// a sequence). Sequences own their elements, and sequences are themselves owned 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// by a LayerAnimator. 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(vollick) Create a 'blended' sequence for transitioning between 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// sequences. 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(vollick) Eventually, the LayerAnimator will switch to a model where new 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// work is scheduled rather than calling methods directly. This should make it 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// impossible for temporary pointers to running animations to go stale. When 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// this happens, there will be no need for LayerAnimationSequences to support 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// weak pointers. 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class COMPOSITOR_EXPORT LayerAnimationSequence 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public base::SupportsWeakPtr<LayerAnimationSequence> { 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerAnimationSequence(); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Takes ownership of the given element and adds it to the sequence. 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit LayerAnimationSequence(LayerAnimationElement* element); 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~LayerAnimationSequence(); 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the start time for the animation. This must be called before the 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // first call to {Start, IsFinished}. Once the animation is finished, this 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // must be called again in order to restart the animation. 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_start_time(base::TimeTicks start_time) { start_time_ = start_time; } 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks start_time() const { return start_time_; } 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets a flag indicating that this sequence will start together with other 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // sequences, and at least one of the sequences in this group has a threaded 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // first element. 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_waiting_for_group_start(bool waiting) { 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) waiting_for_group_start_ = waiting; 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool waiting_for_group_start() { return waiting_for_group_start_; } 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This must be called before the first call to Progress. If starting the 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // animation involves dispatching to another thread, then this will proceed 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // with that dispatch, ultimately resulting in the animation getting an 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // effective start time (the time the animation starts on the other thread). 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch void Start(LayerAnimationDelegate* delegate); 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Updates the delegate to the appropriate value for |now|. Requests a 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // redraw if it is required. 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Progress(base::TimeTicks now, LayerAnimationDelegate* delegate); 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if calling Progress now, with the given time, will finish 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the animation. 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsFinished(base::TimeTicks time); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Updates the delegate to the end of the animation; if this sequence is 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // cyclic, updates the delegate to the end of one cycle of the sequence. 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ProgressToEnd(LayerAnimationDelegate* delegate); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sets the target value to the value that would have been set had 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the sequence completed. Does nothing if the sequence is cyclic. 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void GetTargetValue(LayerAnimationElement::TargetValue* target) const; 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Aborts the given animation. 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void Abort(LayerAnimationDelegate* delegate); 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // All properties modified by the sequence. 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerAnimationElement::AnimatableProperties properties() const { 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return properties_; 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adds an element to the sequence. The sequences takes ownership of this 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // element. 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void AddElement(LayerAnimationElement* element); 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Sequences can be looped indefinitely. 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_is_cyclic(bool is_cyclic) { is_cyclic_ = is_cyclic; } 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_cyclic() const { return is_cyclic_; } 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns true if this sequence has at least one element conflicting with a 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // property in |other|. 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool HasConflictingProperty( 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LayerAnimationElement::AnimatableProperties other) const; 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if the first element animates on the compositor thread. 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsFirstElementThreaded() const; 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Used to identify groups of sequences that are supposed to start together. 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Once started, used to identify the sequence that owns a particular 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // threaded animation. 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int animation_group_id() const { return animation_group_id_; } 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void set_animation_group_id(int id) { animation_group_id_ = id; } 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These functions are used for adding or removing observers from the observer 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // list. The observers are notified when animations end. 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void AddObserver(LayerAnimationObserver* observer); 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void RemoveObserver(LayerAnimationObserver* observer); 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when a threaded animation is actually started. 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnThreadedAnimationStarted(const cc::AnimationEvent& event); 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when the animator schedules this sequence. 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnScheduled(); 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Called when the animator is destroyed. 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnAnimatorDestroyed(); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The last_progressed_fraction of the element most recently progressed by 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // by this sequence. Returns 0.0 if no elements have been progressed. 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) double last_progressed_fraction() const { return last_progressed_fraction_; } 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t size() const; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerAnimationElement* FirstElement() const; 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) friend class LayerAnimatorTestController; 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef std::vector<linked_ptr<LayerAnimationElement> > Elements; 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(LayerAnimatorTest, 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObserverReleasedBeforeAnimationSequenceEnds); 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notifies the observers that this sequence has been scheduled. 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void NotifyScheduled(); 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notifies the observers that this sequence has ended. 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void NotifyEnded(); 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Notifies the observers that this sequence has been aborted. 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void NotifyAborted(); 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The currently animating element. 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LayerAnimationElement* CurrentElement() const; 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The union of all the properties modified by all elements in the sequence. 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) LayerAnimationElement::AnimatableProperties properties_; 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The elements in the sequence. 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Elements elements_; 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True if the sequence should be looped forever. 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool is_cyclic_; 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These are used when animating to efficiently find the next element. 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t last_element_; 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks last_start_; 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The start time of the current run of the sequence. 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks start_time_; 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // True if this sequence will start together with other sequences, and at 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // least one of the sequences in this group has a threaded first element. 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool waiting_for_group_start_; 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Identifies groups of sequences that are supposed to start together. 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Also used to identify the owner of a particular threaded animation; any 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // in-progress threaded animation owned by this sequence will have this 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // group id. 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int animation_group_id_; 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // These parties are notified when layer animations end. 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ObserverList<LayerAnimationObserver> observers_; 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Tracks the last_progressed_fraction() of the most recently progressed 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // element. 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) double last_progressed_fraction_; 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WeakPtrFactory<LayerAnimationSequence> weak_ptr_factory_; 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LayerAnimationSequence); 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace ui 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch