1f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Use of this source code is governed by a BSD-style license that can be 3f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// found in the LICENSE file. 4f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 5f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animation_element.h" 6f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 7f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "base/compiler_specific.h" 8f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "cc/animation/animation.h" 9f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "cc/animation/animation_id_provider.h" 10f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/float_animation_curve_adapter.h" 11f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer.h" 12f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animation_delegate.h" 13f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/layer_animator.h" 14f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/scoped_animation_duration_scale_mode.h" 15f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/compositor/transform_animation_curve_adapter.h" 16f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/gfx/animation/tween.h" 17f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti#include "ui/gfx/interpolated_transform.h" 18f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 19f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittinamespace ui { 20f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 21f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittinamespace { 22f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 23f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// The factor by which duration is scaled up or down when using 24f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ScopedAnimationDurationScaleMode. 25f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kSlowDurationScaleMultiplier = 4; 26f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kFastDurationScaleDivisor = 4; 27f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticonst int kNonZeroDurationScaleDivisor = 20; 28f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 29f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// Pause ----------------------------------------------------------------------- 30f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass Pause : public LayerAnimationElement { 31f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 32f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti Pause(AnimatableProperties properties, base::TimeDelta duration) 33f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(properties, duration) { 34f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 35f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~Pause() {} 36f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 37f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 38f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE {} 39f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, 40f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti LayerAnimationDelegate* delegate) OVERRIDE { 41f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return false; 42f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 43f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE {} 44f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 45f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 46f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(Pause); 47f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 48f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 49f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// TransformTransition --------------------------------------------------------- 50f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 51f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass TransformTransition : public LayerAnimationElement { 52f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 53f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti TransformTransition(const gfx::Transform& target, base::TimeDelta duration) 54f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(TRANSFORM, duration), 55f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 56f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 57f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~TransformTransition() {} 58f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 59f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 60f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 61f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetTransformForAnimation(); 62f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 63f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 64f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 65f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation( 66f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::TransformValueBetween(t, start_, target_)); 67f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 68f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 69f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 70f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 71f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->transform = target_; 72f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 73f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 74f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 75f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 76f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 77f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform start_; 78f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const gfx::Transform target_; 79f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 80f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(TransformTransition); 81f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 82f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 83f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// InterpolatedTransformTransition --------------------------------------------- 84f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 85f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass InterpolatedTransformTransition : public LayerAnimationElement { 86f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 87f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti InterpolatedTransformTransition(InterpolatedTransform* interpolated_transform, 88f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base::TimeDelta duration) 89f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(TRANSFORM, duration), 90f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti interpolated_transform_(interpolated_transform) { 91f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 92f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~InterpolatedTransformTransition() {} 93f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 94f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 95f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 96f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 97f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 98f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 99f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation( 100f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti interpolated_transform_->Interpolate(static_cast<float>(t))); 101f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 102f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 103f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 104fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 105f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->transform = interpolated_transform_->Interpolate(1.0f); 106f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 107f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 108f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 109f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 110fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom private: 111f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<InterpolatedTransform> interpolated_transform_; 112f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 113f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformTransition); 114f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 115f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 116fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom// BoundsTransition ------------------------------------------------------------ 117f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 118f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass BoundsTransition : public LayerAnimationElement { 119f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 120f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti BoundsTransition(const gfx::Rect& target, base::TimeDelta duration) 121fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom : LayerAnimationElement(BOUNDS, duration), 122fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom target_(target) { 123fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 124f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~BoundsTransition() {} 125fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 126f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 127f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 128f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetBoundsForAnimation(); 129f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 130f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 131f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 132f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetBoundsFromAnimation( 133f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::RectValueBetween(t, start_, target_)); 134f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 135fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 136f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 137f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 138f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->bounds = target_; 139f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 140f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 141f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 142f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 143f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 144f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Rect start_; 145fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom const gfx::Rect target_; 146f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 147f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(BoundsTransition); 148f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 149f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 150f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// OpacityTransition ----------------------------------------------------------- 151f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 152f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass OpacityTransition : public LayerAnimationElement { 153fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom public: 154fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom OpacityTransition(float target, base::TimeDelta duration) 155fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom : LayerAnimationElement(OPACITY, duration), 156f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(0.0f), 157fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom target_(target) { 158f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 159f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~OpacityTransition() {} 160f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 161f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 162f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 163f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetOpacityForAnimation(); 164f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 165f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 166f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 167f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetOpacityFromAnimation( 168f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::FloatValueBetween(t, start_, target_)); 169f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 170f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 171f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 172f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 173fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom target->opacity = target_; 174fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 175f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 176f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 177f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 178f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 179f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti float start_; 180f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const float target_; 181f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 182f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(OpacityTransition); 183f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 184f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 185f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// VisibilityTransition -------------------------------------------------------- 186f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 187f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass VisibilityTransition : public LayerAnimationElement { 188f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 189f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti VisibilityTransition(bool target, base::TimeDelta duration) 190f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(VISIBILITY, duration), 191f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(false), 192f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 193f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 194f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~VisibilityTransition() {} 195f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 196f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 197f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 198f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetVisibilityForAnimation(); 199f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 200fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 201f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 202f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); 203f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return t == 1.0; 204f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 205f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 206f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 207f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->visibility = target_; 208f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 209f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 210f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 211f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 212f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 213f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti bool start_; 214f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const bool target_; 215f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 216f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(VisibilityTransition); 217f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 218f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 219f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// BrightnessTransition -------------------------------------------------------- 220f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 221f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass BrightnessTransition : public LayerAnimationElement { 222f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 223f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti BrightnessTransition(float target, base::TimeDelta duration) 224f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(BRIGHTNESS, duration), 225f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(0.0f), 226f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 227f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 228f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~BrightnessTransition() {} 229f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 230f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 231f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 232f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetBrightnessForAnimation(); 233f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 234f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 235f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 236f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetBrightnessFromAnimation( 237f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::FloatValueBetween(t, start_, target_)); 238f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 239f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 240f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 241f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 242f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->brightness = target_; 243f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 244f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 245f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 246f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 247f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 248f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti float start_; 249f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const float target_; 250f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 251f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(BrightnessTransition); 252f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 253f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 254f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// GrayscaleTransition --------------------------------------------------------- 255f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 256f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass GrayscaleTransition : public LayerAnimationElement { 257f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 258f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti GrayscaleTransition(float target, base::TimeDelta duration) 259f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(GRAYSCALE, duration), 260f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(0.0f), 261f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 262f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 263f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~GrayscaleTransition() {} 264f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 265f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 266f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 267f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetGrayscaleForAnimation(); 268f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 269f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 270f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 271f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetGrayscaleFromAnimation( 272f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::FloatValueBetween(t, start_, target_)); 273f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 274f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 275f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 276f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 277f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->grayscale = target_; 278f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 279f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 280f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 281f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 282f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 283f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti float start_; 284f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const float target_; 285fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 286fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition); 287f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 288f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 289f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ColorTransition ------------------------------------------------------------- 290f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 291fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromclass ColorTransition : public LayerAnimationElement { 292f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 293f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ColorTransition(SkColor target, base::TimeDelta duration) 294fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom : LayerAnimationElement(COLOR, duration), 295f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(SK_ColorBLACK), 296f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 297f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 298f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~ColorTransition() {} 299f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 300f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 301f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 302f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetColorForAnimation(); 303f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 304f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 305f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 306f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetColorFromAnimation( 307f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::ColorValueBetween(t, start_, target_)); 308f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 309f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 310f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 311f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 312f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->color = target_; 313f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 314f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 315f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 316f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 317f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 318f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti SkColor start_; 319f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const SkColor target_; 320f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 321f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(ColorTransition); 322f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 323f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 324f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedLayerAnimationElement ----------------------------------------------- 325f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 326f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedLayerAnimationElement : public LayerAnimationElement { 327f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 328f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedLayerAnimationElement(AnimatableProperties properties, 329f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base::TimeDelta duration) 330f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(properties, duration) { 331f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 332f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~ThreadedLayerAnimationElement() {} 333f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 334f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool IsThreaded() const OVERRIDE { 335f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return (duration() != base::TimeDelta()); 336f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 337f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 338f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 339f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element) 340f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : LayerAnimationElement(element) { 341f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 342f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 343f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual bool OnProgress(double t, 344f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti LayerAnimationDelegate* delegate) OVERRIDE { 345f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (t < 1.0) 346f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return false; 347f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 348f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (Started()) { 349f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->RemoveThreadedAnimation(animation_id()); 350f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 351f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 352f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti OnEnd(delegate); 353f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return true; 354f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 355f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 356f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 357f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (delegate && Started()) { 358f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->RemoveThreadedAnimation(animation_id()); 359f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 360f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 361f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 362f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void RequestEffectiveStart( 363f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti LayerAnimationDelegate* delegate) OVERRIDE { 364f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(animation_group_id()); 365f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (duration() == base::TimeDelta()) { 366f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti set_effective_start_time(requested_start_time()); 367f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return; 368f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 369f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti set_effective_start_time(base::TimeTicks()); 370f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::Animation> animation = CreateCCAnimation(); 371f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation->set_needs_synchronized_start_time(true); 372f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->AddThreadedAnimation(animation.Pass()); 373fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 374f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 375f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; 376f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 377f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; 378f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 379f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 380f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); 381f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 382f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 383f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedOpacityTransition --------------------------------------------------- 384f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 385f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedOpacityTransition : public ThreadedLayerAnimationElement { 386f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 387f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedOpacityTransition(float target, base::TimeDelta duration) 388f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : ThreadedLayerAnimationElement(OPACITY, duration), 389f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_(0.0f), 390f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 391f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 392f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~ThreadedOpacityTransition() {} 393f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 394f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 395fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 396f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetOpacityForAnimation(); 397fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 398f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 399f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 400f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (delegate && Started()) { 401f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedLayerAnimationElement::OnAbort(delegate); 402f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetOpacityFromAnimation(gfx::Tween::FloatValueBetween( 403f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 404f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_, 405f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_)); 406f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 407f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 408f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 409f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 410f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetOpacityFromAnimation(target_); 411f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 412f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 413f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 414f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::AnimationCurve> animation_curve( 415f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti new FloatAnimationCurveAdapter(tween_type(), 416f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_, 417f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_, 418f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti duration())); 419f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::Animation> animation( 420f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti cc::Animation::Create(animation_curve.Pass(), 421fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom animation_id(), 422f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_group_id(), 423f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti cc::Animation::Opacity)); 424f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return animation.Pass(); 425f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 426f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 427f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 428f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->opacity = target_; 429f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 430f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 431f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 432f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti float start_; 433f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const float target_; 434f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 435f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); 436f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 437f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 438f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// ThreadedTransformTransition ------------------------------------------------- 439f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 440f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitticlass ThreadedTransformTransition : public ThreadedLayerAnimationElement { 441f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 442f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedTransformTransition(const gfx::Transform& target, 443f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base::TimeDelta duration) 444f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : ThreadedLayerAnimationElement(TRANSFORM, duration), 445f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_(target) { 446f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 447f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~ThreadedTransformTransition() {} 448f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 449f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 450f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 451f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_ = delegate->GetTransformForAnimation(); 452f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 453f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 454f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 455f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (delegate && Started()) { 456f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedLayerAnimationElement::OnAbort(delegate); 457f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation(gfx::Tween::TransformValueBetween( 458f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 459f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_, 460f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_)); 461f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 462f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 463f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 464f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 465f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation(target_); 466f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 467f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 468f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 469f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::AnimationCurve> animation_curve( 470f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti new TransformAnimationCurveAdapter(tween_type(), 471f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti start_, 472f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target_, 473f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti duration())); 474fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom scoped_ptr<cc::Animation> animation( 475fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom cc::Animation::Create(animation_curve.Pass(), 476fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom animation_id(), 477f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_group_id(), 478f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti cc::Animation::Transform)); 479f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return animation.Pass(); 480f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 481f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 482f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 483fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom target->transform = target_; 484fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 485f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 486f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 487f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform start_; 488f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const gfx::Transform target_; 489f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 490f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); 491f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 492f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 493f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// InverseTransformTransision -------------------------------------------------- 494f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 495fcac410fa15613873a07143ccd46470b869346a3Brian Carlstromclass InverseTransformTransition : public ThreadedLayerAnimationElement { 496f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti public: 497f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti InverseTransformTransition(const gfx::Transform& base_transform, 498f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const LayerAnimationElement* uninverted_transition) 499f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : ThreadedLayerAnimationElement(*uninverted_transition), 500fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom base_transform_(base_transform), 501f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti uninverted_transition_( 502f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti CheckAndCast<const ThreadedTransformTransition*>( 503f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti uninverted_transition)) { 504f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 505f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual ~InverseTransformTransition() {} 506f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 507f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti static InverseTransformTransition* Clone(const LayerAnimationElement* other) { 508f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const InverseTransformTransition* other_inverse = 509f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti CheckAndCast<const InverseTransformTransition*>(other); 510f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return new InverseTransformTransition( 511f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti other_inverse->base_transform_, other_inverse->uninverted_transition_); 512f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 513f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 514f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti protected: 515f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 516f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform start(delegate->GetTransformForAnimation()); 517f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti effective_start_ = base_transform_ * start; 518f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 519fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom TargetValue target; 520f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti uninverted_transition_->GetTargetValue(&target); 521f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_target_ = target.transform; 522fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 523f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti set_tween_type(uninverted_transition_->tween_type()); 524f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 525fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom TransformAnimationCurveAdapter base_curve(tween_type(), 526f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_transform_, 527f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_target_, 528f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti duration()); 529f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 530fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom animation_curve_.reset(new InverseTransformCurveAdapter( 531f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_curve, start, duration())); 532f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti computed_target_transform_ = ComputeWithBaseTransform(effective_start_, 533f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_target_); 534f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 535f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 536fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 537f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if (delegate && Started()) { 538f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti ThreadedLayerAnimationElement::OnAbort(delegate); 539f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation(ComputeCurrentTransform()); 540f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 541f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 542fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 543f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 544f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->SetTransformFromAnimation(computed_target_transform_); 545fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 546f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 547f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 548f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::Animation> animation( 549fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom cc::Animation::Create(animation_curve_->Clone(), 550f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_id(), 551f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_group_id(), 552f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti cc::Animation::Transform)); 553f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return animation.Pass(); 554f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 555f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 556f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 557f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti target->transform = computed_target_transform_; 558f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 559f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 560f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti private: 561f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform ComputeCurrentTransform() const { 562f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform base_current = gfx::Tween::TransformValueBetween( 563f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 564f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_transform_, 565f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti base_target_); 566f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return ComputeWithBaseTransform(effective_start_, base_current); 567f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 568f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 569f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform ComputeWithBaseTransform(gfx::Transform start, 570fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom gfx::Transform target) const { 571fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom gfx::Transform to_return(gfx::Transform::kSkipInitialization); 572f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti bool success = target.GetInverse(&to_return); 573f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(success) << "Target transform must be invertible."; 574f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 575f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti to_return.PreconcatTransform(start); 576f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return to_return; 577fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom } 578fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 579f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti template <typename T> 580f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti static T CheckAndCast(const LayerAnimationElement* element) { 581f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti AnimatableProperties properties = element->properties(); 582f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(properties & TRANSFORM); 583f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti return static_cast<T>(element); 584f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti } 585f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 586fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom gfx::Transform effective_start_; 587fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom gfx::Transform computed_target_transform_; 588f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 589f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const gfx::Transform base_transform_; 590f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti gfx::Transform base_target_; 591f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 592f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti scoped_ptr<cc::AnimationCurve> animation_curve_; 593fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom 594fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom const ThreadedTransformTransition* const uninverted_transition_; 595f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 596f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition); 597f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti}; 598f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 599f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} // namespace 600f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 601f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// LayerAnimationElement::TargetValue ------------------------------------------ 602f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 603f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::TargetValue::TargetValue() 604f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : opacity(0.0f), 605f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti visibility(false), 606f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti brightness(0.0f), 607f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti grayscale(0.0f), 608f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti color(SK_ColorBLACK) { 609f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} 610f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 611f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::TargetValue::TargetValue( 612f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const LayerAnimationDelegate* delegate) 613f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()), 614f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti transform(delegate ? 615f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti delegate->GetTransformForAnimation() : gfx::Transform()), 616f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f), 617f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti visibility(delegate ? delegate->GetVisibilityForAnimation() : false), 618f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f), 619f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f), 620f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti color(delegate ? delegate->GetColorForAnimation() : 0.0f) { 621f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} 622f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 623f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti// LayerAnimationElement ------------------------------------------------------- 624f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 625f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::LayerAnimationElement( 626f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti AnimatableProperties properties, base::TimeDelta duration) 627f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : first_frame_(true), 628f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti properties_(properties), 629f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti duration_(GetEffectiveDuration(duration)), 630f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti tween_type_(gfx::Tween::LINEAR), 631f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_id_(cc::AnimationIdProvider::NextAnimationId()), 632f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_group_id_(0), 633f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti last_progressed_fraction_(0.0), 634f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti weak_ptr_factory_(this) { 635f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} 636f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 637f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::LayerAnimationElement( 638f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti const LayerAnimationElement &element) 639f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti : first_frame_(element.first_frame_), 640f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti properties_(element.properties_), 641f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti duration_(element.duration_), 642f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti tween_type_(element.tween_type_), 643f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_id_(cc::AnimationIdProvider::NextAnimationId()), 644f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti animation_group_id_(element.animation_group_id_), 645f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti last_progressed_fraction_(element.last_progressed_fraction_), 646fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom weak_ptr_factory_(this) { 647fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom} 648f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 649f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo ColittiLayerAnimationElement::~LayerAnimationElement() { 650f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} 651f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 652f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittivoid LayerAnimationElement::Start(LayerAnimationDelegate* delegate, 653f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti int animation_group_id) { 654f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(requested_start_time_ != base::TimeTicks()); 655fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom DCHECK(first_frame_); 656fcac410fa15613873a07143ccd46470b869346a3Brian Carlstrom animation_group_id_ = animation_group_id; 657f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti last_progressed_fraction_ = 0.0; 658f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti OnStart(delegate); 659f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti RequestEffectiveStart(delegate); 660f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti first_frame_ = false; 661f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti} 662f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 663f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colittibool LayerAnimationElement::Progress(base::TimeTicks now, 664f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti LayerAnimationDelegate* delegate) { 665f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(requested_start_time_ != base::TimeTicks()); 666f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti DCHECK(!first_frame_); 667f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 668f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti bool need_draw; 669f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti double t = 1.0; 670f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti 671f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti if ((effective_start_time_ == base::TimeTicks()) || 672f3beefc96a5a4f295562f60d648bd6e795980a10Lorenzo Colitti (now < effective_start_time_)) { 673 // This hasn't actually started yet. 674 need_draw = false; 675 last_progressed_fraction_ = 0.0; 676 return need_draw; 677 } 678 679 base::TimeDelta elapsed = now - effective_start_time_; 680 if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) 681 t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); 682 base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr()); 683 need_draw = OnProgress(gfx::Tween::CalculateValue(tween_type_, t), delegate); 684 if (!alive) 685 return need_draw; 686 first_frame_ = t == 1.0; 687 last_progressed_fraction_ = t; 688 return need_draw; 689} 690 691bool LayerAnimationElement::IsFinished(base::TimeTicks time, 692 base::TimeDelta* total_duration) { 693 // If an effective start has been requested but the effective start time 694 // hasn't yet been set, the animation is not finished, regardless of the 695 // value of |time|. 696 if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) 697 return false; 698 699 base::TimeDelta queueing_delay; 700 if (!first_frame_) 701 queueing_delay = effective_start_time_ - requested_start_time_; 702 703 base::TimeDelta elapsed = time - requested_start_time_; 704 if (elapsed >= duration_ + queueing_delay) { 705 *total_duration = duration_ + queueing_delay; 706 return true; 707 } 708 return false; 709} 710 711bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { 712 if (first_frame_) 713 OnStart(delegate); 714 base::WeakPtr<LayerAnimationElement> alive(weak_ptr_factory_.GetWeakPtr()); 715 bool need_draw = OnProgress(1.0, delegate); 716 if (!alive) 717 return need_draw; 718 last_progressed_fraction_ = 1.0; 719 first_frame_ = true; 720 return need_draw; 721} 722 723void LayerAnimationElement::GetTargetValue(TargetValue* target) const { 724 OnGetTarget(target); 725} 726 727bool LayerAnimationElement::IsThreaded() const { 728 return false; 729} 730 731void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { 732 OnAbort(delegate); 733 first_frame_ = true; 734} 735 736void LayerAnimationElement::RequestEffectiveStart( 737 LayerAnimationDelegate* delegate) { 738 DCHECK(requested_start_time_ != base::TimeTicks()); 739 effective_start_time_ = requested_start_time_; 740} 741 742// static 743LayerAnimationElement::AnimatableProperty 744LayerAnimationElement::ToAnimatableProperty( 745 cc::Animation::TargetProperty property) { 746 switch (property) { 747 case cc::Animation::Transform: 748 return TRANSFORM; 749 case cc::Animation::Opacity: 750 return OPACITY; 751 default: 752 NOTREACHED(); 753 return AnimatableProperty(); 754 } 755} 756 757// static 758base::TimeDelta LayerAnimationElement::GetEffectiveDuration( 759 const base::TimeDelta& duration) { 760 switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) { 761 case ScopedAnimationDurationScaleMode::NORMAL_DURATION: 762 return duration; 763 case ScopedAnimationDurationScaleMode::FAST_DURATION: 764 return duration / kFastDurationScaleDivisor; 765 case ScopedAnimationDurationScaleMode::SLOW_DURATION: 766 return duration * kSlowDurationScaleMultiplier; 767 case ScopedAnimationDurationScaleMode::NON_ZERO_DURATION: 768 return duration / kNonZeroDurationScaleDivisor; 769 case ScopedAnimationDurationScaleMode::ZERO_DURATION: 770 return base::TimeDelta(); 771 default: 772 NOTREACHED(); 773 return base::TimeDelta(); 774 } 775} 776 777// static 778LayerAnimationElement* LayerAnimationElement::CreateTransformElement( 779 const gfx::Transform& transform, 780 base::TimeDelta duration) { 781 return new ThreadedTransformTransition(transform, duration); 782} 783 784// static 785LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement( 786 const gfx::Transform& base_transform, 787 const LayerAnimationElement* uninverted_transition) { 788 return new InverseTransformTransition(base_transform, uninverted_transition); 789} 790 791// static 792LayerAnimationElement* LayerAnimationElement::CloneInverseTransformElement( 793 const LayerAnimationElement* other) { 794 return InverseTransformTransition::Clone(other); 795} 796 797// static 798LayerAnimationElement* 799LayerAnimationElement::CreateInterpolatedTransformElement( 800 InterpolatedTransform* interpolated_transform, 801 base::TimeDelta duration) { 802 return new InterpolatedTransformTransition(interpolated_transform, duration); 803} 804 805// static 806LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( 807 const gfx::Rect& bounds, 808 base::TimeDelta duration) { 809 return new BoundsTransition(bounds, duration); 810} 811 812// static 813LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( 814 float opacity, 815 base::TimeDelta duration) { 816 return new ThreadedOpacityTransition(opacity, duration); 817} 818 819// static 820LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( 821 bool visibility, 822 base::TimeDelta duration) { 823 return new VisibilityTransition(visibility, duration); 824} 825 826// static 827LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement( 828 float brightness, 829 base::TimeDelta duration) { 830 return new BrightnessTransition(brightness, duration); 831} 832 833// static 834LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement( 835 float grayscale, 836 base::TimeDelta duration) { 837 return new GrayscaleTransition(grayscale, duration); 838} 839 840// static 841LayerAnimationElement* LayerAnimationElement::CreatePauseElement( 842 AnimatableProperties properties, 843 base::TimeDelta duration) { 844 return new Pause(properties, duration); 845} 846 847// static 848LayerAnimationElement* LayerAnimationElement::CreateColorElement( 849 SkColor color, 850 base::TimeDelta duration) { 851 return new ColorTransition(color, duration); 852} 853 854} // namespace ui 855