layer_animation_element.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation_id_provider.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/float_animation_curve_adapter.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/compositor/transform_animation_curve_adapter.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/animation/tween.h" 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/gfx/interpolated_transform.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace ui { 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace { 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The factor by which duration is scaled up or down when 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedAnimationDurationScaleMode::duration_scale_mode() is SLOW_DURATION or 25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// FAST_DURATION. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSlowDurationScaleFactor = 4; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFastDurationScaleFactor = 4; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Pause ----------------------------------------------------------------------- 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pause : public LayerAnimationElement { 31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pause(const AnimatableProperties& properties, base::TimeDelta duration) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(properties, duration) { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Pause() {} 36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE {} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Pause); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransformTransition --------------------------------------------------------- 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransformTransition : public LayerAnimationElement { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch TransformTransition(const gfx::Transform& target, base::TimeDelta duration) 54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : LayerAnimationElement(GetProperties(), duration), 55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target_(target) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TransformTransition() {} 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::TransformValueBetween(t, start_, target_)); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target->transform = target_; 72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform target_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TransformTransition); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// InterpolatedTransformTransition --------------------------------------------- 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InterpolatedTransformTransition : public LayerAnimationElement { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InterpolatedTransformTransition(InterpolatedTransform* interpolated_transform, 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interpolated_transform_(interpolated_transform) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~InterpolatedTransformTransition() {} 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation( 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) interpolated_transform_->Interpolate(static_cast<float>(t))); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = interpolated_transform_->Interpolate(1.0f); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<InterpolatedTransform> interpolated_transform_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformTransition); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BoundsTransition ------------------------------------------------------------ 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BoundsTransition : public LayerAnimationElement { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundsTransition(const gfx::Rect& target, base::TimeDelta duration) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~BoundsTransition() {} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 138b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) protected: 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetBoundsForAnimation(); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetBoundsFromAnimation( 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::RectValueBetween(t, start_, target_)); 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->bounds = target_; 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 154ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 155ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private: 156ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static AnimatableProperties GetProperties() { 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AnimatableProperties properties; 158ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch properties.insert(LayerAnimationElement::BOUNDS); 159ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return properties; 160ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect start_; 163ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const gfx::Rect target_; 164ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BoundsTransition); 166ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 167ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// OpacityTransition ----------------------------------------------------------- 169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass OpacityTransition : public LayerAnimationElement { 171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OpacityTransition(float target, base::TimeDelta duration) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 174b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) start_(0.0f), 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~OpacityTransition() {} 178ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 180ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 181ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch start_ = delegate->GetOpacityForAnimation(); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 183ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 184ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 185ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->SetOpacityFromAnimation( 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Tween::FloatValueBetween(t, start_, target_)); 187ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return true; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 190ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 191ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target->opacity = target_; 192ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 194ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private: 197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static AnimatableProperties GetProperties() { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return properties; 201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch float start_; 204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const float target_; 205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 206ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DISALLOW_COPY_AND_ASSIGN(OpacityTransition); 207ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 208ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VisibilityTransition -------------------------------------------------------- 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisibilityTransition : public LayerAnimationElement { 212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch public: 213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch VisibilityTransition(bool target, base::TimeDelta duration) 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : LayerAnimationElement(GetProperties(), duration), 215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch start_(false), 216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target_(target) { 217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 218ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~VisibilityTransition() {} 219ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 220ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 221ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetVisibilityForAnimation(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 226ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); 227ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return t == 1.0; 228ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 229ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 230ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 231ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target->visibility = target_; 232ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 235ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 236ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch private: 237ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static AnimatableProperties GetProperties() { 238ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch AnimatableProperties properties; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::VISIBILITY); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool start_; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const bool target_; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VisibilityTransition); 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// BrightnessTransition -------------------------------------------------------- 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BrightnessTransition : public LayerAnimationElement { 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BrightnessTransition(float target, base::TimeDelta duration) 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_(0.0f), 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~BrightnessTransition() {} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetBrightnessForAnimation(); 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetBrightnessFromAnimation( 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::FloatValueBetween(t, start_, target_)); 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->brightness = target_; 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::BRIGHTNESS); 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_; 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float target_; 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrightnessTransition); 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GrayscaleTransition --------------------------------------------------------- 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GrayscaleTransition : public LayerAnimationElement { 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GrayscaleTransition(float target, base::TimeDelta duration) 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_(0.0f), 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~GrayscaleTransition() {} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 303868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) start_ = delegate->GetGrayscaleForAnimation(); 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetGrayscaleFromAnimation( 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::FloatValueBetween(t, start_, target_)); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->grayscale = target_; 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) properties.insert(LayerAnimationElement::GRAYSCALE); 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return properties; 323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) float start_; 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const float target_; 327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition); 329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// ColorTransition ------------------------------------------------------------- 332c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class ColorTransition : public LayerAnimationElement { 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ColorTransition(SkColor target, base::TimeDelta duration) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(SK_ColorBLACK), 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ColorTransition() {} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetColorForAnimation(); 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetColorFromAnimation( 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::ColorValueBetween(t, start_, target_)); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->color = target_; 3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static AnimatableProperties GetProperties() { 3617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AnimatableProperties properties; 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) properties.insert(LayerAnimationElement::COLOR); 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SkColor start_; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const SkColor target_; 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ColorTransition); 370ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 371ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedLayerAnimationElement ----------------------------------------------- 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ThreadedLayerAnimationElement : public LayerAnimationElement { 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch public: 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadedLayerAnimationElement(const AnimatableProperties& properties, 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(properties, duration) { 379ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 380ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual ~ThreadedLayerAnimationElement() {} 381ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 382ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool IsThreaded() const OVERRIDE { 383ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return (duration() != base::TimeDelta()); 384ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 385ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 386ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch protected: 387ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element) 388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : LayerAnimationElement(element) { 389ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual bool OnProgress(double t, 392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LayerAnimationDelegate* delegate) OVERRIDE { 393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (t < 1.0) 394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (Started()) { 397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->RemoveThreadedAnimation(animation_id()); 398ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 399ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 400ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OnEnd(delegate); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 404ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 405ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (delegate && Started()) { 406ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->RemoveThreadedAnimation(animation_id()); 407ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 408ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RequestEffectiveStart( 411ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LayerAnimationDelegate* delegate) OVERRIDE { 412ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(animation_group_id()); 413ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (duration() == base::TimeDelta()) { 414ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch set_effective_start_time(requested_start_time()); 415ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return; 416ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 417ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch set_effective_start_time(base::TimeTicks()); 418ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<cc::Animation> animation = CreateCCAnimation(); 419ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch animation->set_needs_synchronized_start_time(true); 420ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->AddThreadedAnimation(animation.Pass()); 421ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedOpacityTransition --------------------------------------------------- 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 433ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass ThreadedOpacityTransition : public ThreadedLayerAnimationElement { 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 435ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ThreadedOpacityTransition(float target, base::TimeDelta duration) 436ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : ThreadedLayerAnimationElement(GetProperties(), duration), 437ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch start_(0.0f), 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 439ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedOpacityTransition() {} 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 450ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->SetOpacityFromAnimation(gfx::Tween::FloatValueBetween( 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 455ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 457ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(target_); 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FloatAnimationCurveAdapter(tween_type(), 46490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) start_, 465ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch target_, 46690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) duration())); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<cc::Animation> animation( 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Opacity)); 472ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return animation.Pass(); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 474ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->opacity = target_; 477ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float target_; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedTransformTransition ------------------------------------------------- 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedTransformTransition : public ThreadedLayerAnimationElement { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedTransformTransition(const gfx::Transform& target, 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) target_(target) { 500868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedTransformTransition() {} 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_ = Layer::ConvertTransformToCCTransform(start_, 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_ = Layer::ConvertTransformToCCTransform(target_, 510ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch device_scale_factor); 511ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 512ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 513ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 514ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (delegate && Started()) { 515ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ThreadedLayerAnimationElement::OnAbort(delegate); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(gfx::Tween::TransformValueBetween( 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(target_); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TransformAnimationCurveAdapter(tween_type(), 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_, 5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch cc_target_, 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 5337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<cc::Animation> animation( 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Transform)); 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = target_; 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start_; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_start_; 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform target_; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_target_; 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// InverseTransformTransision -------------------------------------------------- 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InverseTransformTransition : public ThreadedLayerAnimationElement { 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InverseTransformTransition(const gfx::Transform& base_transform, 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerAnimationElement* uninverted_transition) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(*uninverted_transition), 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_transform_(base_transform), 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninverted_transition_( 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckAndCast<const ThreadedTransformTransition*>( 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninverted_transition)) { 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~InverseTransformTransition() {} 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static InverseTransformTransition* Clone(const LayerAnimationElement* other) { 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const InverseTransformTransition* other_inverse = 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckAndCast<const InverseTransformTransition*>(other); 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new InverseTransformTransition( 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) other_inverse->base_transform_, other_inverse->uninverted_transition_); 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start(delegate->GetTransformForAnimation()); 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_ = base_transform_ * start; 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TargetValue target; 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uninverted_transition_->GetTargetValue(&target); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_target_ = target.transform; 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_tween_type(uninverted_transition_->tween_type()); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform cc_base_start = Layer::ConvertTransformToCCTransform( 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_transform_, 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform cc_base_target = Layer::ConvertTransformToCCTransform( 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_target_, 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TransformAnimationCurveAdapter base_curve(tween_type(), 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_base_start, 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_base_target, 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration()); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform cc_start = Layer::ConvertTransformToCCTransform( 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start, device_scale_factor); 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_curve_.reset(new InverseTransformCurveAdapter( 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_curve, cc_start, duration())); 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) computed_target_transform_ = ComputeWithBaseTransform(effective_start_, 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_target_); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate && Started()) { 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetTransformFromAnimation(ComputeCurrentTransform()); 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 620ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch delegate->SetTransformFromAnimation(computed_target_transform_); 621ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 622ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve_->Clone(), 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Transform)); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = computed_target_transform_; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform ComputeCurrentTransform() const { 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform base_current = gfx::Tween::TransformValueBetween( 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_transform_, 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base_target_); 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ComputeWithBaseTransform(effective_start_, base_current); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform ComputeWithBaseTransform(gfx::Transform start, 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform target) const { 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool success = target.GetInverse(&to_return); 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success) << "Target transform must be invertible."; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_return.PreconcatTransform(start); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return to_return; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) template <typename T> 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static T CheckAndCast(const LayerAnimationElement* element) { 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const AnimatableProperties& properties = element->properties(); 664ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(properties.find(TRANSFORM) != properties.end()); 665ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return static_cast<T>(element); 666ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch } 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform effective_start_; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform computed_target_transform_; 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform base_transform_; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform base_target_; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 674ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch scoped_ptr<cc::AnimationCurve> animation_curve_; 675ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 676ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const ThreadedTransformTransition* const uninverted_transition_; 677ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 678ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition); 679ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}; 680ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 681ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace 682ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement::TargetValue ------------------------------------------ 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue() 686ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch : opacity(0.0f), 687ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch visibility(false), 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness(0.0f), 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) grayscale(0.0f), 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color(SK_ColorBLACK) { 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue( 694ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const LayerAnimationDelegate* delegate) 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()), 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform(delegate ? 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->GetTransformForAnimation() : gfx::Transform()), 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f), 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) visibility(delegate ? delegate->GetVisibilityForAnimation() : false), 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f), 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f), 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) color(delegate ? delegate->GetColorForAnimation() : 0.0f) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// LayerAnimationElement ------------------------------------------------------- 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 707ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochLayerAnimationElement::LayerAnimationElement( 70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const AnimatableProperties& properties, 70990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::TimeDelta duration) 71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) : first_frame_(true), 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties_(properties), 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration_(GetEffectiveDuration(duration)), 713ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch tween_type_(gfx::Tween::LINEAR), 714ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch animation_id_(cc::AnimationIdProvider::NextAnimationId()), 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) animation_group_id_(0), 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_progressed_fraction_(0.0), 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const LayerAnimationElement &element) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : first_frame_(element.first_frame_), 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_(element.properties_), 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration_(element.duration_), 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tween_type_(element.tween_type_), 726ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch animation_id_(cc::AnimationIdProvider::NextAnimationId()), 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(element.animation_group_id_), 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(element.last_progressed_fraction_), 729ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch weak_ptr_factory_(this) { 730ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::~LayerAnimationElement() { 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 734ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int animation_group_id) { 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(first_frame_); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) animation_group_id_ = animation_group_id; 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStart(delegate); 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestEffectiveStart(delegate); 743ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch first_frame_ = false; 744ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerAnimationElement::Progress(base::TimeTicks now, 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 749ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(!first_frame_); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool need_draw; 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double t = 1.0; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((effective_start_time_ == base::TimeTicks()) || 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (now < effective_start_time_)) { 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This hasn't actually started yet. 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) need_draw = false; 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return need_draw; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta elapsed = now - effective_start_time_; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr()); 766ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch need_draw = OnProgress(gfx::Tween::CalculateValue(tween_type_, t), delegate); 767ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch if (!alive) 768ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch return need_draw; 769ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch first_frame_ = t == 1.0; 770ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_progressed_fraction_ = t; 771ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return need_draw; 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LayerAnimationElement::IsFinished(base::TimeTicks time, 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* total_duration) { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If an effective start has been requested but the effective start time 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // hasn't yet been set, the animation is not finished, regardless of the 778ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // value of |time|. 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta queueing_delay; 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_) 784ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch queueing_delay = effective_start_time_ - requested_start_time_; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = time - requested_start_time_; 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elapsed >= duration_ + queueing_delay) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *total_duration = duration_ + queueing_delay; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 791ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 792ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (first_frame_) 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnStart(delegate); 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr()); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw = OnProgress(1.0, delegate); 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!alive) 800ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return need_draw; 801ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch last_progressed_fraction_ = 1.0; 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_frame_ = true; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return need_draw; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 806ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerAnimationElement::GetTargetValue(TargetValue* target) const { 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetTarget(target); 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 809ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 810ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbool LayerAnimationElement::IsThreaded() const { 811ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return false; 812ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 813ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 814ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { 815ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch OnAbort(delegate); 816ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch first_frame_ = true; 817ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 818ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 819ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid LayerAnimationElement::RequestEffectiveStart( 820ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch LayerAnimationDelegate* delegate) { 821ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch DCHECK(requested_start_time_ != base::TimeTicks()); 822ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch effective_start_time_ = requested_start_time_; 823ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} 824ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 825ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static 826ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochLayerAnimationElement::AnimatableProperty 827ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochLayerAnimationElement::ToAnimatableProperty( 828ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch cc::Animation::TargetProperty property) { 829ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch switch (property) { 830ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case cc::Animation::Transform: 831ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return TRANSFORM; 832ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch case cc::Animation::Opacity: 833ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch return OPACITY; 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 835 NOTREACHED(); 836 return AnimatableProperty(); 837 } 838} 839 840// static 841base::TimeDelta LayerAnimationElement::GetEffectiveDuration( 842 const base::TimeDelta& duration) { 843 switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) { 844 case ScopedAnimationDurationScaleMode::NORMAL_DURATION: 845 return duration; 846 case ScopedAnimationDurationScaleMode::FAST_DURATION: 847 return duration / kFastDurationScaleFactor; 848 case ScopedAnimationDurationScaleMode::SLOW_DURATION: 849 return duration * kSlowDurationScaleFactor; 850 case ScopedAnimationDurationScaleMode::ZERO_DURATION: 851 return base::TimeDelta(); 852 default: 853 NOTREACHED(); 854 return base::TimeDelta(); 855 } 856} 857 858// static 859LayerAnimationElement* LayerAnimationElement::CreateTransformElement( 860 const gfx::Transform& transform, 861 base::TimeDelta duration) { 862 return new ThreadedTransformTransition(transform, duration); 863} 864 865// static 866LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement( 867 const gfx::Transform& base_transform, 868 const LayerAnimationElement* uninverted_transition) { 869 return new InverseTransformTransition(base_transform, uninverted_transition); 870} 871 872// static 873LayerAnimationElement* LayerAnimationElement::CloneInverseTransformElement( 874 const LayerAnimationElement* other) { 875 return InverseTransformTransition::Clone(other); 876} 877 878// static 879LayerAnimationElement* 880LayerAnimationElement::CreateInterpolatedTransformElement( 881 InterpolatedTransform* interpolated_transform, 882 base::TimeDelta duration) { 883 return new InterpolatedTransformTransition(interpolated_transform, duration); 884} 885 886// static 887LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( 888 const gfx::Rect& bounds, 889 base::TimeDelta duration) { 890 return new BoundsTransition(bounds, duration); 891} 892 893// static 894LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( 895 float opacity, 896 base::TimeDelta duration) { 897 return new ThreadedOpacityTransition(opacity, duration); 898} 899 900// static 901LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( 902 bool visibility, 903 base::TimeDelta duration) { 904 return new VisibilityTransition(visibility, duration); 905} 906 907// static 908LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement( 909 float brightness, 910 base::TimeDelta duration) { 911 return new BrightnessTransition(brightness, duration); 912} 913 914// static 915LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement( 916 float grayscale, 917 base::TimeDelta duration) { 918 return new GrayscaleTransition(grayscale, duration); 919} 920 921// static 922LayerAnimationElement* LayerAnimationElement::CreatePauseElement( 923 const AnimatableProperties& properties, 924 base::TimeDelta duration) { 925 return new Pause(properties, duration); 926} 927 928// static 929LayerAnimationElement* LayerAnimationElement::CreateColorElement( 930 SkColor color, 931 base::TimeDelta duration) { 932 return new ColorTransition(color, duration); 933} 934 935} // namespace ui 936