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(), id
, AnimationIdProvider::NextGroupId(),
49 animation
->set_needs_synchronized_start_time(true);
51 target
->AddAnimation(animation
.Pass());
55 template <class Target
>
56 int AddAnimatedTransform(Target
* target
,
58 TransformOperations start_operations
,
59 TransformOperations operations
) {
60 scoped_ptr
<KeyframedTransformAnimationCurve
>
61 curve(KeyframedTransformAnimationCurve::Create());
64 curve
->AddKeyframe(TransformKeyframe::Create(base::TimeDelta(),
65 start_operations
, nullptr));
68 curve
->AddKeyframe(TransformKeyframe::Create(
69 base::TimeDelta::FromSecondsD(duration
), operations
, nullptr));
71 int id
= AnimationIdProvider::NextAnimationId();
73 scoped_ptr
<Animation
> animation(
74 Animation::Create(curve
.Pass(), id
, AnimationIdProvider::NextGroupId(),
75 Animation::TRANSFORM
));
76 animation
->set_needs_synchronized_start_time(true);
78 target
->AddAnimation(animation
.Pass());
82 template <class Target
>
83 int AddAnimatedTransform(Target
* target
,
87 TransformOperations start_operations
;
89 start_operations
.AppendTranslate(delta_x
, delta_y
, 0.0);
92 TransformOperations operations
;
93 operations
.AppendTranslate(delta_x
, delta_y
, 0.0);
94 return AddAnimatedTransform(target
, duration
, start_operations
, operations
);
97 template <class Target
>
98 int AddAnimatedFilter(Target
* target
,
100 float start_brightness
,
101 float end_brightness
) {
102 scoped_ptr
<KeyframedFilterAnimationCurve
>
103 curve(KeyframedFilterAnimationCurve::Create());
105 if (duration
> 0.0) {
106 FilterOperations start_filters
;
107 start_filters
.Append(
108 FilterOperation::CreateBrightnessFilter(start_brightness
));
110 FilterKeyframe::Create(base::TimeDelta(), start_filters
, nullptr));
113 FilterOperations filters
;
114 filters
.Append(FilterOperation::CreateBrightnessFilter(end_brightness
));
115 curve
->AddKeyframe(FilterKeyframe::Create(
116 base::TimeDelta::FromSecondsD(duration
), filters
, nullptr));
118 int id
= AnimationIdProvider::NextAnimationId();
120 scoped_ptr
<Animation
> animation(Animation::Create(
121 curve
.Pass(), id
, AnimationIdProvider::NextGroupId(), Animation::FILTER
));
122 animation
->set_needs_synchronized_start_time(true);
124 target
->AddAnimation(animation
.Pass());
128 FakeFloatAnimationCurve::FakeFloatAnimationCurve()
129 : duration_(base::TimeDelta::FromSecondsD(1.0)) {
132 FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration
)
133 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
136 FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {}
138 base::TimeDelta
FakeFloatAnimationCurve::Duration() const {
142 float FakeFloatAnimationCurve::GetValue(base::TimeDelta now
) const {
146 scoped_ptr
<AnimationCurve
> FakeFloatAnimationCurve::Clone() const {
147 return make_scoped_ptr(new FakeFloatAnimationCurve
);
150 FakeTransformTransition::FakeTransformTransition(double duration
)
151 : duration_(base::TimeDelta::FromSecondsD(duration
)) {
154 FakeTransformTransition::~FakeTransformTransition() {}
156 base::TimeDelta
FakeTransformTransition::Duration() const {
160 gfx::Transform
FakeTransformTransition::GetValue(base::TimeDelta time
) const {
161 return gfx::Transform();
164 bool FakeTransformTransition::AnimatedBoundsForBox(const gfx::BoxF
& box
,
165 gfx::BoxF
* bounds
) const {
169 bool FakeTransformTransition::AffectsScale() const { return false; }
171 bool FakeTransformTransition::IsTranslation() const { return true; }
173 bool FakeTransformTransition::PreservesAxisAlignment() const {
177 bool FakeTransformTransition::AnimationStartScale(bool forward_direction
,
178 float* start_scale
) const {
183 bool FakeTransformTransition::MaximumTargetScale(bool forward_direction
,
184 float* max_scale
) const {
189 scoped_ptr
<AnimationCurve
> FakeTransformTransition::Clone() const {
190 return make_scoped_ptr(new FakeTransformTransition(*this));
193 FakeFloatTransition::FakeFloatTransition(double duration
, float from
, float to
)
194 : duration_(base::TimeDelta::FromSecondsD(duration
)), from_(from
), to_(to
) {
197 FakeFloatTransition::~FakeFloatTransition() {}
199 base::TimeDelta
FakeFloatTransition::Duration() const {
203 float FakeFloatTransition::GetValue(base::TimeDelta time
) const {
204 double progress
= TimeUtil::Divide(time
, duration_
);
207 return (1.0 - progress
) * from_
+ progress
* to_
;
210 FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver()
211 : opacity_(0.0f
), animation_waiting_for_deletion_(false) {
214 FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {}
216 void FakeLayerAnimationValueObserver::OnFilterAnimated(
217 const FilterOperations
& filters
) {
221 void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity
) {
225 void FakeLayerAnimationValueObserver::OnTransformAnimated(
226 const gfx::Transform
& transform
) {
227 transform_
= transform
;
230 void FakeLayerAnimationValueObserver::OnScrollOffsetAnimated(
231 const gfx::ScrollOffset
& scroll_offset
) {
232 scroll_offset_
= scroll_offset
;
235 void FakeLayerAnimationValueObserver::OnAnimationWaitingForDeletion() {
236 animation_waiting_for_deletion_
= true;
239 bool FakeLayerAnimationValueObserver::IsActive() const {
243 bool FakeInactiveLayerAnimationValueObserver::IsActive() const {
247 gfx::ScrollOffset
FakeLayerAnimationValueProvider::ScrollOffsetForAnimation()
249 return scroll_offset_
;
252 scoped_ptr
<AnimationCurve
> FakeFloatTransition::Clone() const {
253 return make_scoped_ptr(new FakeFloatTransition(*this));
256 int AddOpacityTransitionToController(LayerAnimationController
* controller
,
260 bool use_timing_function
) {
261 return AddOpacityTransition(controller
,
265 use_timing_function
);
268 int AddAnimatedTransformToController(LayerAnimationController
* controller
,
272 return AddAnimatedTransform(controller
,
278 int AddAnimatedFilterToController(LayerAnimationController
* controller
,
280 float start_brightness
,
281 float end_brightness
) {
282 return AddAnimatedFilter(
283 controller
, duration
, start_brightness
, end_brightness
);
286 int AddOpacityTransitionToLayer(Layer
* layer
,
290 bool use_timing_function
) {
291 return AddOpacityTransition(layer
,
295 use_timing_function
);
298 int AddOpacityTransitionToLayer(LayerImpl
* layer
,
302 bool use_timing_function
) {
303 return AddOpacityTransition(layer
->layer_animation_controller(),
307 use_timing_function
);
310 int AddAnimatedTransformToLayer(Layer
* layer
,
314 return AddAnimatedTransform(layer
, duration
, delta_x
, delta_y
);
317 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
321 return AddAnimatedTransform(layer
->layer_animation_controller(),
327 int AddAnimatedTransformToLayer(Layer
* layer
,
329 TransformOperations start_operations
,
330 TransformOperations operations
) {
331 return AddAnimatedTransform(layer
, duration
, start_operations
, operations
);
334 int AddAnimatedTransformToLayer(LayerImpl
* layer
,
336 TransformOperations start_operations
,
337 TransformOperations operations
) {
338 return AddAnimatedTransform(layer
->layer_animation_controller(),
344 int AddAnimatedFilterToLayer(Layer
* layer
,
346 float start_brightness
,
347 float end_brightness
) {
348 return AddAnimatedFilter(layer
, duration
, start_brightness
, end_brightness
);
351 int AddAnimatedFilterToLayer(LayerImpl
* layer
,
353 float start_brightness
,
354 float end_brightness
) {
355 return AddAnimatedFilter(layer
->layer_animation_controller(),