animation_test_common.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/test/animation_test_common.h"
6
7#include "cc/keyframed_animation_curve.h"
8#include "cc/layer.h"
9#include "cc/layer_animation_controller.h"
10#include "cc/layer_impl.h"
11#include <public/WebTransformOperations.h>
12
13using cc::ActiveAnimation;
14using cc::AnimationCurve;
15using cc::EaseTimingFunction;
16using cc::FloatKeyframe;
17using cc::KeyframedFloatAnimationCurve;
18using cc::KeyframedTransformAnimationCurve;
19using cc::TimingFunction;
20using cc::TransformKeyframe;
21
22namespace {
23
24static int nextAnimationId = 0;
25
26template <class Target>
27int addOpacityTransition(Target& target, double duration, float startOpacity, float endOpacity, bool useTimingFunction)
28{
29    scoped_ptr<KeyframedFloatAnimationCurve> curve(KeyframedFloatAnimationCurve::create());
30
31    scoped_ptr<TimingFunction> func;
32    if (!useTimingFunction)
33        func = EaseTimingFunction::create();
34    if (duration > 0)
35        curve->addKeyframe(FloatKeyframe::create(0, startOpacity, func.Pass()));
36    curve->addKeyframe(FloatKeyframe::create(duration, endOpacity, scoped_ptr<cc::TimingFunction>()));
37
38    int id = nextAnimationId++;
39
40    scoped_ptr<ActiveAnimation> animation(ActiveAnimation::create(curve.PassAs<AnimationCurve>(), id, 0, ActiveAnimation::Opacity));
41    animation->setNeedsSynchronizedStartTime(true);
42
43    target.addAnimation(animation.Pass());
44    return id;
45}
46
47template <class Target>
48int addAnimatedTransform(Target& target, double duration, int deltaX, int deltaY)
49{
50    scoped_ptr<KeyframedTransformAnimationCurve> curve(KeyframedTransformAnimationCurve::create());
51
52    if (duration > 0) {
53        WebKit::WebTransformOperations startOperations;
54        startOperations.appendTranslate(deltaX, deltaY, 0);
55        curve->addKeyframe(TransformKeyframe::create(0, startOperations, scoped_ptr<cc::TimingFunction>()));
56    }
57
58    WebKit::WebTransformOperations operations;
59    operations.appendTranslate(deltaX, deltaY, 0);
60    curve->addKeyframe(TransformKeyframe::create(duration, operations, scoped_ptr<cc::TimingFunction>()));
61
62    int id = nextAnimationId++;
63
64    scoped_ptr<ActiveAnimation> animation(ActiveAnimation::create(curve.PassAs<AnimationCurve>(), id, 0, ActiveAnimation::Transform));
65    animation->setNeedsSynchronizedStartTime(true);
66
67    target.addAnimation(animation.Pass());
68    return id;
69}
70
71} // namespace
72
73namespace WebKitTests {
74
75FakeFloatAnimationCurve::FakeFloatAnimationCurve()
76    : m_duration(1)
77{
78}
79
80FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration)
81    : m_duration(duration)
82{
83}
84
85FakeFloatAnimationCurve::~FakeFloatAnimationCurve()
86{
87}
88
89double FakeFloatAnimationCurve::duration() const
90{
91    return m_duration;
92}
93
94float FakeFloatAnimationCurve::getValue(double now) const
95{
96    return 0;
97}
98
99scoped_ptr<cc::AnimationCurve> FakeFloatAnimationCurve::clone() const
100{
101    return make_scoped_ptr(new FakeFloatAnimationCurve).PassAs<cc::AnimationCurve>();
102}
103
104FakeTransformTransition::FakeTransformTransition(double duration)
105    : m_duration(duration)
106{
107}
108
109FakeTransformTransition::~FakeTransformTransition()
110{
111}
112
113double FakeTransformTransition::duration() const
114{
115    return m_duration;
116}
117
118WebKit::WebTransformationMatrix FakeTransformTransition::getValue(double time) const
119{
120    return WebKit::WebTransformationMatrix();
121}
122
123scoped_ptr<cc::AnimationCurve> FakeTransformTransition::clone() const
124{
125    return make_scoped_ptr(new FakeTransformTransition(*this)).PassAs<cc::AnimationCurve>();
126}
127
128
129FakeFloatTransition::FakeFloatTransition(double duration, float from, float to)
130    : m_duration(duration)
131    , m_from(from)
132    , m_to(to)
133{
134}
135
136FakeFloatTransition::~FakeFloatTransition()
137{
138}
139
140double FakeFloatTransition::duration() const
141{
142    return m_duration;
143}
144
145float FakeFloatTransition::getValue(double time) const
146{
147    time /= m_duration;
148    if (time >= 1)
149        time = 1;
150    return (1 - time) * m_from + time * m_to;
151}
152
153FakeLayerAnimationControllerClient::FakeLayerAnimationControllerClient()
154    : m_opacity(0)
155{
156}
157
158FakeLayerAnimationControllerClient::~FakeLayerAnimationControllerClient()
159{
160}
161
162int FakeLayerAnimationControllerClient::id() const
163{
164    return 0;
165}
166
167void FakeLayerAnimationControllerClient::setOpacityFromAnimation(float opacity)
168{
169    m_opacity = opacity;
170}
171
172float FakeLayerAnimationControllerClient::opacity() const
173{
174    return m_opacity;
175}
176
177void FakeLayerAnimationControllerClient::setTransformFromAnimation(const WebKit::WebTransformationMatrix& transform)
178{
179    m_transform = transform;
180}
181
182const WebKit::WebTransformationMatrix& FakeLayerAnimationControllerClient::transform() const
183{
184    return m_transform;
185}
186
187scoped_ptr<cc::AnimationCurve> FakeFloatTransition::clone() const
188{
189    return make_scoped_ptr(new FakeFloatTransition(*this)).PassAs<cc::AnimationCurve>();
190}
191
192int addOpacityTransitionToController(cc::LayerAnimationController& controller, double duration, float startOpacity, float endOpacity, bool useTimingFunction)
193{
194    return addOpacityTransition(controller, duration, startOpacity, endOpacity, useTimingFunction);
195}
196
197int addAnimatedTransformToController(cc::LayerAnimationController& controller, double duration, int deltaX, int deltaY)
198{
199    return addAnimatedTransform(controller, duration, deltaX, deltaY);
200}
201
202int addOpacityTransitionToLayer(cc::Layer& layer, double duration, float startOpacity, float endOpacity, bool useTimingFunction)
203{
204    return addOpacityTransition(layer, duration, startOpacity, endOpacity, useTimingFunction);
205}
206
207int addOpacityTransitionToLayer(cc::LayerImpl& layer, double duration, float startOpacity, float endOpacity, bool useTimingFunction)
208{
209    return addOpacityTransition(*layer.layerAnimationController(), duration, startOpacity, endOpacity, useTimingFunction);
210}
211
212int addAnimatedTransformToLayer(cc::Layer& layer, double duration, int deltaX, int deltaY)
213{
214    return addAnimatedTransform(layer, duration, deltaX, deltaY);
215}
216
217int addAnimatedTransformToLayer(cc::LayerImpl& layer, double duration, int deltaX, int deltaY)
218{
219    return addAnimatedTransform(*layer.layerAnimationController(), duration, deltaX, deltaY);
220}
221
222} // namespace WebKitTests
223