layer_animation_element.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_element.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (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" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (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" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/transform_animation_curve_adapter.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/tween.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/interpolated_transform.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The factor by which duration is scaled up or down when 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ScopedAnimationDurationScaleMode::duration_scale_mode() is SLOW_DURATION or 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// FAST_DURATION. 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kSlowDurationScaleFactor = 4; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kFastDurationScaleFactor = 4; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pause ----------------------------------------------------------------------- 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Pause : public LayerAnimationElement { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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() {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 385821806d5e7f356e8fa4b058a389a808ea183019Torne (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 {} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Pause); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TransformTransition --------------------------------------------------------- 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TransformTransition : public LayerAnimationElement { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TransformTransition(const gfx::Transform& target, base::TimeDelta duration) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TransformTransition() {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetTransformFromAnimation( 66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, start_, target_)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->transform = target_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform start_; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Transform target_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TransformTransition); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// InterpolatedTransformTransition --------------------------------------------- 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InterpolatedTransformTransition : public LayerAnimationElement { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterpolatedTransformTransition(InterpolatedTransform* interpolated_transform, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interpolated_transform_(interpolated_transform) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~InterpolatedTransformTransition() {} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetTransformFromAnimation( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interpolated_transform_->Interpolate(static_cast<float>(t))); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->transform = interpolated_transform_->Interpolate(1.0f); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<InterpolatedTransform> interpolated_transform_; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformTransition); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BoundsTransition ------------------------------------------------------------ 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (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) { 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BoundsTransition() {} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetBoundsForAnimation(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate->SetBoundsFromAnimation( 145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, start_, target_)); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds = target_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::BOUNDS); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect start_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect target_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BoundsTransition); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OpacityTransition ----------------------------------------------------------- 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OpacityTransition : public LayerAnimationElement { 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpacityTransition(float target, base::TimeDelta duration) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OpacityTransition() {} 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate->SetOpacityFromAnimation( 186d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, start_, target_)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->opacity = target_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OpacityTransition); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VisibilityTransition -------------------------------------------------------- 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisibilityTransition : public LayerAnimationElement { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibilityTransition(bool target, base::TimeDelta duration) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(false), 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VisibilityTransition() {} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetVisibilityForAnimation(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return t == 1.0; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->visibility = target_; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::VISIBILITY); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool start_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool target_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VisibilityTransition); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrightnessTransition -------------------------------------------------------- 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrightnessTransition : public LayerAnimationElement { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrightnessTransition(float target, base::TimeDelta duration) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrightnessTransition() {} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetBrightnessForAnimation(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetBrightnessFromAnimation( 267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, start_, target_)); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->brightness = target_; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::BRIGHTNESS); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrightnessTransition); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GrayscaleTransition --------------------------------------------------------- 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GrayscaleTransition : public LayerAnimationElement { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GrayscaleTransition(float target, base::TimeDelta duration) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GrayscaleTransition() {} 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetGrayscaleForAnimation(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetGrayscaleFromAnimation( 308d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, start_, target_)); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->grayscale = target_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::GRAYSCALE); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ColorTransition ------------------------------------------------------------- 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ColorTransition : public LayerAnimationElement { 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (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) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ColorTransition() {} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetColorForAnimation(); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetColorFromAnimation( 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColorSetARGB( 350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, 351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetA(start_)), 352d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetA(target_))), 353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, 354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetR(start_)), 355d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetR(target_))), 356d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, 357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetG(start_)), 358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetG(target_))), 359d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::ValueBetween(t, 360d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetB(start_)), 361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static_cast<int>(SkColorGetB(target_))))); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->color = target_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::COLOR); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor start_; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor target_; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ColorTransition); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedLayerAnimationElement ----------------------------------------------- 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedLayerAnimationElement : public LayerAnimationElement { 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement(const AnimatableProperties& properties, 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(properties, duration) { 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedLayerAnimationElement() {} 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsThreaded() const OVERRIDE { 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (duration() != base::TimeDelta()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element) 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : LayerAnimationElement(element) { 40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (t < 1.0) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Started()) { 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnEnd(delegate); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RequestEffectiveStart( 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(animation_group_id()); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (duration() == base::TimeDelta()) { 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(requested_start_time()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(base::TimeTicks()); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation = CreateCCAnimation(); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->set_needs_synchronized_start_time(true); 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->AddThreadedAnimation(animation.Pass()); 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedOpacityTransition --------------------------------------------------- 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedOpacityTransition : public ThreadedLayerAnimationElement { 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedOpacityTransition(float target, base::TimeDelta duration) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_(0.0f), 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedOpacityTransition() {} 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 462d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate->SetOpacityFromAnimation(gfx::Tween::ValueBetween( 463d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 464d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) start_, 465d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) target_)); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(target_); 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FloatAnimationCurveAdapter(tween_type(), 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_, 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Opacity)); 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->opacity = target_; 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_; 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float target_; 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedTransformTransition ------------------------------------------------- 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedTransformTransition : public ThreadedLayerAnimationElement { 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedTransformTransition(const gfx::Transform& target, 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedTransformTransition() {} 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_ = Layer::ConvertTransformToCCTransform(start_, 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_ = Layer::ConvertTransformToCCTransform(target_, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 5267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (delegate && Started()) { 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 528d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) delegate->SetTransformFromAnimation(gfx::Tween::ValueBetween( 529d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(target_); 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TransformAnimationCurveAdapter(tween_type(), 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_, 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Transform)); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = target_; 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start_; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_start_; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform target_; 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_target_; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// InverseTransformTransision -------------------------------------------------- 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InverseTransformTransition : public ThreadedLayerAnimationElement { 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InverseTransformTransition(const gfx::Transform& base_transform, 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement* uninverted_transition) 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : ThreadedLayerAnimationElement(*uninverted_transition), 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_(base_transform), 580d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uninverted_transition_( 581d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CheckAndCast<const ThreadedTransformTransition*>( 582d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) uninverted_transition)) { 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~InverseTransformTransition() {} 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 586d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static InverseTransformTransition* Clone(const LayerAnimationElement* other) { 587d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const InverseTransformTransition* other_inverse = 588d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) CheckAndCast<const InverseTransformTransition*>(other); 589d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return new InverseTransformTransition( 590d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) other_inverse->base_transform_, other_inverse->uninverted_transition_); 591d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 592d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform start(delegate->GetTransformForAnimation()); 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) effective_start_ = base_transform_ * start; 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TargetValue target; 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uninverted_transition_->GetTargetValue(&target); 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_ = target.transform; 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) set_tween_type(uninverted_transition_->tween_type()); 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_base_start = Layer::ConvertTransformToCCTransform( 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_, 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) device_scale_factor); 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_base_target = Layer::ConvertTransformToCCTransform( 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_, 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) device_scale_factor); 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TransformAnimationCurveAdapter base_curve(tween_type(), 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_base_start, 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_base_target, 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration()); 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_start = Layer::ConvertTransformToCCTransform( 61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start, device_scale_factor); 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_curve_.reset(new InverseTransformCurveAdapter( 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_curve, cc_start, duration())); 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) computed_target_transform_ = ComputeWithBaseTransform(effective_start_, 62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_); 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (delegate && Started()) { 62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delegate->SetTransformFromAnimation(ComputeCurrentTransform()); 62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delegate->SetTransformFromAnimation(computed_target_transform_); 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc::Animation::Create(animation_curve_->Clone(), 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_id(), 63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_group_id(), 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc::Animation::Transform)); 64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return animation.Pass(); 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) target->transform = computed_target_transform_; 64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform ComputeCurrentTransform() const { 650d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Transform base_current = gfx::Tween::ValueBetween( 651d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type(), last_progressed_fraction()), 65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_, 65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_); 65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ComputeWithBaseTransform(effective_start_, base_current); 65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform ComputeWithBaseTransform(gfx::Transform start, 65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform target) const { 65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 660d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool success = target.GetInverse(&to_return); 661d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) DCHECK(success) << "Target transform must be invertible."; 66258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 66358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) to_return.PreconcatTransform(start); 66458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return; 66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static AnimatableProperties GetProperties() { 66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AnimatableProperties properties; 66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return properties; 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 673d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) template <typename T> 674d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) static T CheckAndCast(const LayerAnimationElement* element) { 67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const AnimatableProperties& properties = element->properties(); 67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(properties.find(TRANSFORM) != properties.end()); 677d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return static_cast<T>(element); 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform effective_start_; 68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform computed_target_transform_; 68258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform base_transform_; 68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_target_; 68558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve_; 68758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 68858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const ThreadedTransformTransition* const uninverted_transition_; 68958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 69058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition); 69158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 69258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement::TargetValue ------------------------------------------ 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue() 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : opacity(0.0f), 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(false), 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(0.0f), 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(0.0f), 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(SK_ColorBLACK) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue( 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationDelegate* delegate) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()), 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform(delegate ? 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->GetTransformForAnimation() : gfx::Transform()), 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f), 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(delegate ? delegate->GetVisibilityForAnimation() : false), 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f), 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f), 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(delegate ? delegate->GetColorForAnimation() : 0.0f) { 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement ------------------------------------------------------- 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : first_frame_(true), 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_(properties), 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) duration_(GetEffectiveDuration(duration)), 725d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) tween_type_(gfx::Tween::LINEAR), 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id_(cc::AnimationIdProvider::NextAnimationId()), 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 73258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement &element) 73358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : first_frame_(element.first_frame_), 73458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties_(element.properties_), 73558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_(element.duration_), 73658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) tween_type_(element.tween_type_), 73758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_id_(cc::AnimationIdProvider::NextAnimationId()), 73858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_group_id_(element.animation_group_id_), 73958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) last_progressed_fraction_(element.last_progressed_fraction_) { 74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::~LayerAnimationElement() { 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int animation_group_id) { 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(first_frame_); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = animation_group_id; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnStart(delegate); 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestEffectiveStart(delegate); 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = false; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::Progress(base::TimeTicks now, 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!first_frame_); 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw; 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double t = 1.0; 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((effective_start_time_ == base::TimeTicks()) || 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (now < effective_start_time_)) { 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This hasn't actually started yet. 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_draw = false; 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = now - effective_start_time_; 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); 775d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) need_draw = OnProgress(gfx::Tween::CalculateValue(tween_type_, t), delegate); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = t == 1.0; 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = t; 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsFinished(base::TimeTicks time, 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* total_duration) { 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If an effective start has been requested but the effective start time 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hasn't yet been set, the animation is not finished, regardless of the 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |time|. 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta queueing_delay; 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queueing_delay = effective_start_time_ - requested_start_time_; 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = time - requested_start_time_; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elapsed >= duration_ + queueing_delay) { 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *total_duration = duration_ + queueing_delay; 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (first_frame_) 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStart(delegate); 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw = OnProgress(1.0, delegate); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 1.0; 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = true; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return need_draw; 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationElement::GetTargetValue(TargetValue* target) const { 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetTarget(target); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsThreaded() const { 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAbort(delegate); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_frame_ = true; 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::RequestEffectiveStart( 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) { 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time_ = requested_start_time_; 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::AnimatableProperty 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::ToAnimatableProperty( 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::TargetProperty property) { 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (property) { 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Transform: 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TRANSFORM; 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Opacity: 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OPACITY; 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AnimatableProperty(); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta LayerAnimationElement::GetEffectiveDuration( 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta& duration) { 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) { 8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::NORMAL_DURATION: 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration; 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::FAST_DURATION: 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration / kFastDurationScaleFactor; 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::SLOW_DURATION: 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration * kSlowDurationScaleFactor; 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::ZERO_DURATION: 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateTransformElement( 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Transform& transform, 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedTransformTransition(transform, duration); 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 87058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement( 87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform& base_transform, 87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement* uninverted_transition) { 87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return new InverseTransformTransition(base_transform, uninverted_transition); 87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static 877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CloneInverseTransformElement( 878d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) const LayerAnimationElement* other) { 879d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return InverseTransformTransition::Clone(other); 880d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 881d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 882d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// static 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::CreateInterpolatedTransformElement( 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterpolatedTransform* interpolated_transform, 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new InterpolatedTransformTransition(interpolated_transform, duration); 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BoundsTransition(bounds, duration); 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float opacity, 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedOpacityTransition(opacity, duration); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool visibility, 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new VisibilityTransition(visibility, duration); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement( 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float brightness, 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BrightnessTransition(brightness, duration); 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement( 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float grayscale, 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new GrayscaleTransition(grayscale, duration); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreatePauseElement( 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Pause(properties, duration); 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateColorElement( 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color, 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ColorTransition(color, duration); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 940