[chromium] Animation events should only be used for synchronizing animation start...
[WebKit-https.git] / Source / WebCore / platform / graphics / chromium / cc / CCLayerAnimationController.h
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1.  Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  * 2.  Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24
25 #ifndef CCLayerAnimationController_h
26 #define CCLayerAnimationController_h
27
28 #include "cc/CCActiveAnimation.h"
29 #include "cc/CCAnimationCurve.h"
30 #include "cc/CCAnimationEvents.h"
31
32 #include <wtf/HashSet.h>
33 #include <wtf/Noncopyable.h>
34 #include <wtf/OwnPtr.h>
35 #include <wtf/PassOwnPtr.h>
36 #include <wtf/Vector.h>
37 namespace WebCore {
38
39 class Animation;
40 class IntSize;
41 class KeyframeValueList;
42 class TransformationMatrix;
43
44 class CCLayerAnimationControllerClient {
45 public:
46     virtual ~CCLayerAnimationControllerClient() { }
47
48     virtual int id() const = 0;
49     virtual void setOpacityFromAnimation(float) = 0;
50     virtual float opacity() const = 0;
51     virtual void setTransformFromAnimation(const TransformationMatrix&) = 0;
52     virtual const TransformationMatrix& transform() const = 0;
53     virtual const IntSize& bounds() const = 0;
54 };
55
56 class CCLayerAnimationController {
57     WTF_MAKE_NONCOPYABLE(CCLayerAnimationController);
58 public:
59     static PassOwnPtr<CCLayerAnimationController> create(CCLayerAnimationControllerClient*);
60
61     virtual ~CCLayerAnimationController();
62
63     // These methods are virtual for testing.
64     virtual bool addAnimation(const KeyframeValueList&, const IntSize& boxSize, const Animation*, int animationId, int groupId, double timeOffset);
65     virtual void pauseAnimation(int animationId, double timeOffset);
66     virtual void removeAnimation(int animationId);
67     virtual void suspendAnimations(double time);
68     virtual void resumeAnimations();
69
70     // Ensures that the list of active animations on the main thread and the impl thread
71     // are kept in sync. This function does not take ownership of the impl thread controller.
72     virtual void pushAnimationUpdatesTo(CCLayerAnimationController*);
73
74     void animate(double monotonicTime, CCAnimationEventsVector*);
75
76     void add(PassOwnPtr<CCActiveAnimation>);
77
78     // Returns the active animation in the given group, animating the given property if such an
79     // animation exists.
80     CCActiveAnimation* getActiveAnimation(int groupId, CCActiveAnimation::TargetProperty);
81
82     // Returns true if there are any animations that have neither finished nor aborted.
83     bool hasActiveAnimation() const;
84
85     // Returns true if there is an animation currently animating the given property, or
86     // if there is an animation scheduled to animate this property in the future.
87     bool isAnimatingProperty(CCActiveAnimation::TargetProperty) const;
88
89     // This is called in response to an animation being started on the impl thread. This
90     // function updates the corresponding main thread animation's start time.
91     void notifyAnimationStarted(const CCAnimationStartedEvent&);
92
93 protected:
94     explicit CCLayerAnimationController(CCLayerAnimationControllerClient*);
95
96 private:
97     typedef HashSet<int> TargetProperties;
98
99     void pushNewAnimationsToImplThread(CCLayerAnimationController*);
100     void removeAnimationsCompletedOnMainThread(CCLayerAnimationController*);
101
102     void startAnimationsWaitingForNextTick(double monotonicTime, CCAnimationEventsVector*);
103     void startAnimationsWaitingForStartTime(double monotonicTime, CCAnimationEventsVector*);
104     void startAnimationsWaitingForTargetAvailability(double monotonicTime, CCAnimationEventsVector*);
105     void resolveConflicts(double monotonicTime);
106     void purgeFinishedAnimations();
107
108     void tickAnimations(double monotonicTime);
109
110     CCLayerAnimationControllerClient* m_client;
111     Vector<OwnPtr<CCActiveAnimation> > m_activeAnimations;
112 };
113
114 } // namespace WebCore
115
116 #endif // CCLayerAnimationController_h