animation_test_common.cc revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 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)#include "cc/test/animation_test_common.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/animation_id_provider.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/keyframed_animation_curve.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/layer_animation_controller.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/animation/transform_operations.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/layers/layer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "cc/layers/layer_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::Animation; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::AnimationCurve; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::EaseTimingFunction; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::FloatKeyframe; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::KeyframedFloatAnimationCurve; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::KeyframedTransformAnimationCurve; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::TimingFunction; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::TransformKeyframe; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cc { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Target> 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AddOpacityTransition(Target* target, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double duration, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_opacity, 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float end_opacity, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool use_timing_function) { 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<KeyframedFloatAnimationCurve> 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) curve(KeyframedFloatAnimationCurve::Create()); 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<TimingFunction> func; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!use_timing_function) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) func = EaseTimingFunction::Create(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (duration > 0.0) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve->AddKeyframe(FloatKeyframe::Create(0.0, start_opacity, func.Pass())); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve->AddKeyframe(FloatKeyframe::Create(duration, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_opacity, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<cc::TimingFunction>())); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = AnimationIdProvider::NextAnimationId(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Animation> animation(Animation::Create( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve.PassAs<AnimationCurve>(), 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimationIdProvider::NextGroupId(), 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Animation::Opacity)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) animation->set_needs_synchronized_start_time(true); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->AddAnimation(animation.Pass()); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return id; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <class Target> 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AddAnimatedTransform(Target* target, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double duration, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_x, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int delta_y) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<KeyframedTransformAnimationCurve> 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve(KeyframedTransformAnimationCurve::Create()); 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (duration > 0.0) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformOperations start_operations; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_operations.AppendTranslate(delta_x, delta_y, 0.0); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve->AddKeyframe(TransformKeyframe::Create( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0.0, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_operations, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<cc::TimingFunction>())); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformOperations operations; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operations.AppendTranslate(delta_x, delta_y, 0.0); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve->AddKeyframe(TransformKeyframe::Create( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) duration, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operations, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<cc::TimingFunction>())); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int id = AnimationIdProvider::NextAnimationId(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<Animation> animation(Animation::Create( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) curve.PassAs<AnimationCurve>(), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimationIdProvider::NextGroupId(), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Animation::Transform)); 87 animation->set_needs_synchronized_start_time(true); 88 89 target->AddAnimation(animation.Pass()); 90 return id; 91} 92 93FakeFloatAnimationCurve::FakeFloatAnimationCurve() 94 : duration_(1.0) {} 95 96FakeFloatAnimationCurve::FakeFloatAnimationCurve(double duration) 97 : duration_(duration) {} 98 99FakeFloatAnimationCurve::~FakeFloatAnimationCurve() {} 100 101double FakeFloatAnimationCurve::Duration() const { 102 return duration_; 103} 104 105float FakeFloatAnimationCurve::GetValue(double now) const { 106 return 0.0f; 107} 108 109scoped_ptr<cc::AnimationCurve> FakeFloatAnimationCurve::Clone() const { 110 return make_scoped_ptr( 111 new FakeFloatAnimationCurve).PassAs<cc::AnimationCurve>(); 112} 113 114FakeTransformTransition::FakeTransformTransition(double duration) 115 : duration_(duration) {} 116 117FakeTransformTransition::~FakeTransformTransition() {} 118 119double FakeTransformTransition::Duration() const { 120 return duration_; 121} 122 123gfx::Transform FakeTransformTransition::GetValue(double time) const { 124 return gfx::Transform(); 125} 126 127scoped_ptr<cc::AnimationCurve> FakeTransformTransition::Clone() const { 128 return make_scoped_ptr( 129 new FakeTransformTransition(*this)).PassAs<cc::AnimationCurve>(); 130} 131 132 133FakeFloatTransition::FakeFloatTransition(double duration, float from, float to) 134 : duration_(duration), from_(from), to_(to) {} 135 136FakeFloatTransition::~FakeFloatTransition() {} 137 138double FakeFloatTransition::Duration() const { 139 return duration_; 140} 141 142float FakeFloatTransition::GetValue(double time) const { 143 time /= duration_; 144 if (time >= 1.0) 145 time = 1.0; 146 return (1.0 - time) * from_ + time * to_; 147} 148 149FakeLayerAnimationValueObserver::FakeLayerAnimationValueObserver() 150 : opacity_(0.0f) {} 151 152FakeLayerAnimationValueObserver::~FakeLayerAnimationValueObserver() {} 153 154void FakeLayerAnimationValueObserver::OnOpacityAnimated(float opacity) { 155 opacity_ = opacity; 156} 157 158void FakeLayerAnimationValueObserver::OnTransformAnimated( 159 const gfx::Transform& transform) { 160 transform_ = transform; 161} 162 163bool FakeLayerAnimationValueObserver::IsActive() const { 164 return true; 165} 166 167bool FakeInactiveLayerAnimationValueObserver::IsActive() const { 168 return false; 169} 170 171scoped_ptr<cc::AnimationCurve> FakeFloatTransition::Clone() const { 172 return make_scoped_ptr( 173 new FakeFloatTransition(*this)).PassAs<cc::AnimationCurve>(); 174} 175 176int AddOpacityTransitionToController(cc::LayerAnimationController* controller, 177 double duration, 178 float start_opacity, 179 float end_opacity, 180 bool use_timing_function) { 181 return AddOpacityTransition(controller, 182 duration, 183 start_opacity, 184 end_opacity, 185 use_timing_function); 186} 187 188int AddAnimatedTransformToController(cc::LayerAnimationController* controller, 189 double duration, 190 int delta_x, 191 int delta_y) { 192 return AddAnimatedTransform(controller, 193 duration, 194 delta_x, 195 delta_y); 196} 197 198int AddOpacityTransitionToLayer(cc::Layer* layer, 199 double duration, 200 float start_opacity, 201 float end_opacity, 202 bool use_timing_function) { 203 return AddOpacityTransition(layer, 204 duration, 205 start_opacity, 206 end_opacity, 207 use_timing_function); 208} 209 210int AddOpacityTransitionToLayer(cc::LayerImpl* layer, 211 double duration, 212 float start_opacity, 213 float end_opacity, 214 bool use_timing_function) { 215 return AddOpacityTransition(layer->layer_animation_controller(), 216 duration, 217 start_opacity, 218 end_opacity, 219 use_timing_function); 220} 221 222int AddAnimatedTransformToLayer(cc::Layer* layer, 223 double duration, 224 int delta_x, 225 int delta_y) { 226 return AddAnimatedTransform(layer, duration, delta_x, delta_y); 227} 228 229int AddAnimatedTransformToLayer(cc::LayerImpl* layer, 230 double duration, 231 int delta_x, 232 int delta_y) { 233 return AddAnimatedTransform(layer->layer_animation_controller(), 234 duration, 235 delta_x, 236 delta_y); 237} 238 239} // namespace cc 240