layer_animation_sequence.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LayerAnimationDelegate; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LayerAnimationObserver; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Contains a collection of layer animation elements to be played one after 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// another. Although it has a similar interface to LayerAnimationElement, it is 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not a LayerAnimationElement (i.e., it is not permitted to have a sequence in 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a sequence). Sequences own their elements, and sequences are themselves owned 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by a LayerAnimator. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(vollick) Create a 'blended' sequence for transitioning between 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sequences. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(vollick) Eventually, the LayerAnimator will switch to a model where new 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// work is scheduled rather than calling methods directly. This should make it 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// impossible for temporary pointers to running animations to go stale. When 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this happens, there will be no need for LayerAnimationSequences to support 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// weak pointers. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT LayerAnimationSequence 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::SupportsWeakPtr<LayerAnimationSequence> { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationSequence(); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes ownership of the given element and adds it to the sequence. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit LayerAnimationSequence(LayerAnimationElement* element); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LayerAnimationSequence(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the delegate to the appropriate value for |elapsed|, which is in 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the range [0, Duration()]. If the animation is not aborted, it is 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // guaranteed that Animate will be called with elapsed = Duration(). Requests 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a redraw if it is required. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Progress(base::TimeDelta elapsed, LayerAnimationDelegate* delegate); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the target value to the value that would have been set had 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the sequence completed. Does nothing if the sequence is cyclic. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetTargetValue(LayerAnimationElement::TargetValue* target) const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Aborts the given animation. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Abort(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All properties modified by the sequence. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationElement::AnimatableProperties& properties() const { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties_; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The total, finite duration of one cycle of the sequence. 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration() const { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return duration_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an element to the sequence. The sequences takes ownership of this 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // element. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddElement(LayerAnimationElement* element); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sequences can be looped indefinitely. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_is_cyclic(bool is_cyclic) { is_cyclic_ = is_cyclic; } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_cyclic() const { return is_cyclic_; } 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if this sequence has at least one element affecting a 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // property in |other|. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasCommonProperty( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationElement::AnimatableProperties& other) const; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These functions are used for adding or removing observers from the observer 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list. The observers are notified when animations end. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(LayerAnimationObserver* observer); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(LayerAnimationObserver* observer); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the animator schedules this sequence. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnScheduled(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when the animator is destroyed. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnAnimatorDestroyed(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::vector<linked_ptr<LayerAnimationElement> > Elements; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(LayerAnimatorTest, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverReleasedBeforeAnimationSequenceEnds); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the observers that this sequence has been scheduled. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyScheduled(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the observers that this sequence has ended. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnded(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the observers that this sequence has been aborted. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyAborted(); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The sum of the durations of all the elements in the sequence. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The union of all the properties modified by all elements in the sequence. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationElement::AnimatableProperties properties_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The elements in the sequence. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Elements elements_; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the sequence should be looped forever. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_cyclic_; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are used when animating to efficiently find the next element. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t last_element_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta last_start_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These parties are notified when layer animations end. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<LayerAnimationObserver> observers_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LayerAnimationSequence); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_LAYER_ANIMATION_SEQUENCE_H_ 131