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.
5 #include "cc/test/animation_test_common.h"
7 #include "cc/animation/animation_id_provider.h"
8 #include "cc/animation/keyframed_animation_curve.h"
9 #include "cc/animation/layer_animation_controller.h"
10 #include "cc/animation/transform_operations.h"
11 #include "cc/base/time_util.h"
12 #include "cc/layers/layer.h"
13 #include "cc/layers/layer_impl.h"
16 using cc::AnimationCurve
;
17 using cc::EaseTimingFunction
;
18 using cc::FloatKeyframe
;
19 using cc::KeyframedFloatAnimationCurve
;
20 using cc::KeyframedTransformAnimationCurve
;
21 using cc::TimingFunction
;
22 using cc::TransformKeyframe
;
26 template <class Target
>
27 int AddOpacityTransition(Target
* target
,
31 bool use_timing_function
) {
32 scoped_ptr
<KeyframedFloatAnimationCurve
>
33 curve(KeyframedFloatAnimationCurve::Create());
35 scoped_ptr
<TimingFunction
> func
;
36 if (!use_timing_function
)
37 func
= EaseTimingFunction::Create();
40 FloatKeyframe::Create(base::TimeDelta(), start_opacity
, func
.Pass()));
41 curve
->AddKeyframe(FloatKeyframe::Create(
42 base::TimeDelta::FromSecondsD(duration
), end_opacity
, nullptr));
44 int id
= AnimationIdProvider::NextAnimationId();
46 scoped_ptr
<Animation
> animation(
47 Animation::Create(curve
.Pass(),
49 AnimationIdProvider::NextGroupId(),
51 animation
->set_needs_synchronized_start_time(true);
53 target
->AddAnimation(animation
.Pass());
57 template <class Target
>
58 int AddAnimatedTransform(Target
* target
,
60 TransformOperations start_operations
,
61 TransformOperations operations
) {
62 scoped_ptr
<KeyframedTransformAnimationCurve
>
63 curve(KeyframedTransformAnimationCurve::Create());
66 curve
->AddKeyframe(TransformKeyframe::Create(base::TimeDelta(),
67 start_operations
, nullptr));
70 curve
->AddKeyframe(TransformKeyframe::Create(
71 base::TimeDelta::FromSecondsD(duration
), operations
, nullptr));
73 int id
= AnimationIdProvider::NextAnimationId();
75 scoped_ptr
<Animation
> animation(
76 Animation::Create(curve
.Pass(),
78 AnimationIdProvider::NextGroupId(),
79 Animation::Transform
));
80 animation
->set_needs_synchronized_start_time(true);
82 target
->AddAnimation(animation
.Pass());
86 template <class Target
>
87 int AddAnimatedTransform(Target
* target
,
91 TransformOperations start_operations
;
93 start_operations
.AppendTranslate(delta_x
, delta_y
, 0.0);
96 TransformOperations operations
;
97 operations
.AppendTranslate(delta_x
, delta_y
, 0.0);
98 return AddAnimatedTransform(target
, duration
, start_operations
, operations
);
101 template <class Target
>
102 int AddAnimatedFilter(Target
* target
,
104 float start_brightness
,
105 float end_brightness
) {
106 scoped_ptr
<KeyframedFilterAnimationCurve
>
107 curve(KeyframedFilterAnimationCurve::Create());
109 if (duration
> 0.0) {
110 FilterOperations start_filters
;
111 start_filters
.Append(
112 FilterOperation::CreateBrightnessFilter(start_brightness
));
114 FilterKeyframe::Create(base::TimeDelta(), start_filters
, nullptr));
117 FilterOperations filters
;
118 filters
.Append(FilterOperation::CreateBrightnessFilter(end_brightness
));
119 curve
->AddKeyframe(FilterKeyframe::Create(
120 base::TimeDelta::FromSecondsD(duration
), filters
, nullptr));
122 int id
= AnimationIdProvider::NextAnimationId();
124 scoped_ptr
<Animation
> animation(Animation::Create(
125 curve
.Pass(), id
, AnimationIdProvider::NextGroupId(), Animation::Filter
));
126 animation
->set_needs_synchronized_start_time(true);
128 target
->AddAnimation(animation
.Pass());
132 FakeFloatAnimationCurve::FakeFloatAnimationCurve()
133 : duration_(base::TimeDelta::FromSecondsD(1.0)) {
136 FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration
)
137 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
140 FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
142 base::TimeDelta
FakeFloatAnimationCurve::Duration() const {
146 float FakeFloatAnimationCurve::GetValue(base::TimeDelta now
) const {
150 scoped_ptr
<AnimationCurve
> FakeFloatAnimationCurve::Clone() const {
151 return make_scoped_ptr(new FakeFloatAnimationCurve
);
154 FakeTransformTransition::FakeTransformTransition(double duration
)
155 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
158 FakeTransformTransition::~FakeTransformTransition() {}
160 base::TimeDelta
FakeTransformTransition::Duration() const {
164 gfx::Transform
FakeTransformTransition::GetValue(base::TimeDelta time
) const {
165 return gfx::Transform();
168 bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF
& box
,
169 gfx::BoxF
* bounds
) const {
173 bool FakeTransformTransition::AffectsScale() const { return false; }
175 bool FakeTransformTransition::IsTranslation() const { return true; }
177 bool FakeTransformTransition::MaximumTargetScale(bool forward_direction
,
178 float* max_scale
) const {
183 scoped_ptr
<AnimationCurve
> FakeTransformTransition::Clone() const {
184 return make_scoped_ptr(new FakeTransformTransition(*this));
187 FakeFloatTransition::FakeFloatTransition(double duration
, float from
, float to
)
188 : duration_(base::TimeDelta::FromSecondsD(duration
)), from_(from
), to_(to
) {
191 FakeFloatTransition::~FakeFloatTransition() {}
193 base::TimeDelta
FakeFloatTransition::Duration() const {
197 float FakeFloatTransition::GetValue(base::TimeDelta time
) const {
198 double progress
= TimeUtil::Divide(time
, duration_
);
201 return (1.0 - progress
) * from_
+ progress
* to_
;
204 FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
206 animation_waiting_for_deletion_(false) {}
208 FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
210 void FakeLayerAnimationValueObserver::OnFilterAnimated(
211 const FilterOperations
& filters
) {
215 void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity
) {
219 void FakeLayerAnimationValueObserver::OnTransformAnimated(
220 const gfx::Transform
& transform
) {
221 transform_
= transform
;
224 void FakeLayerAnimationValueObserver::OnScrollOffsetAnimated(
225 const gfx::ScrollOffset
& scroll_offset
) {
226 scroll_offset_
= scroll_offset
;
229 void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
230 animation_waiting_for_deletion_
= true;
233 bool FakeLayerAnimationValueObserver::IsActive() const {
237 bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
241 gfx::ScrollOffset
FakeLayerAnimationValueProvider::ScrollOffsetForAnimation()
243 return scroll_offset_
;
246 scoped_ptr
<AnimationCurve
> FakeFloatTransition::Clone() const {
247 return make_scoped_ptr(new FakeFloatTransition(*this));
250 int AddOpacityTransitionToController(LayerAnimationController
* controller
,
254 bool use_timing_function
) {
255 return AddOpacityTransition(controller
,
259 use_timing_function
);
262 int AddAnimatedTransformToController(LayerAnimationController
* controller
,
266 return AddAnimatedTransform(controller
,
272 int AddAnimatedFilterToController(LayerAnimationController
* controller
,
274 float start_brightness
,
275 float end_brightness
) {
276 return AddAnimatedFilter(
277 controller
, duration
, start_brightness
, end_brightness
);
280 int AddOpacityTransitionToLayer(Layer
* layer
,
284 bool use_timing_function
) {
285 return AddOpacityTransition(layer
,
289 use_timing_function
);
292 int AddOpacityTransitionToLayer(LayerImpl
* layer
,
296 bool use_timing_function
) {
297 return AddOpacityTransition(layer
->layer_animation_controller(),
301 use_timing_function
);
304 int AddAnimatedTransformToLayer(Layer
* layer
,
308 return AddAnimatedTransform(layer
, duration
, delta_x
, delta_y
);
311 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
315 return AddAnimatedTransform(layer
->layer_animation_controller(),
321 int AddAnimatedTransformToLayer(Layer
* layer
,
323 TransformOperations start_operations
,
324 TransformOperations operations
) {
325 return AddAnimatedTransform(layer
, duration
, start_operations
, operations
);
328 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
330 TransformOperations start_operations
,
331 TransformOperations operations
) {
332 return AddAnimatedTransform(layer
->layer_animation_controller(),
338 int AddAnimatedFilterToLayer(Layer
* layer
,
340 float start_brightness
,
341 float end_brightness
) {
342 return AddAnimatedFilter(layer
, duration
, start_brightness
, end_brightness
);
345 int AddAnimatedFilterToLayer(LayerImpl
* layer
,
347 float start_brightness
,
348 float end_brightness
) {
349 return AddAnimatedFilter(layer
->layer_animation_controller(),