layer_animation_element.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/animation/tween.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/float_animation_curve_adapter.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/layer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animation_delegate.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer_animator.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_animation_duration_scale_mode.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/transform_animation_curve_adapter.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( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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 { 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetBoundsFromAnimation(Tween::ValueBetween(t, start_, target_)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->bounds = target_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::BOUNDS); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect start_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect target_; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BoundsTransition); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OpacityTransition ----------------------------------------------------------- 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OpacityTransition : public LayerAnimationElement { 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OpacityTransition(float target, base::TimeDelta duration) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~OpacityTransition() {} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetOpacityFromAnimation(Tween::ValueBetween(t, start_, target_)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->opacity = target_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OpacityTransition); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// VisibilityTransition -------------------------------------------------------- 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VisibilityTransition : public LayerAnimationElement { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VisibilityTransition(bool target, base::TimeDelta duration) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(false), 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~VisibilityTransition() {} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetVisibilityForAnimation(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetVisibilityFromAnimation(t == 1.0 ? target_ : start_); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return t == 1.0; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->visibility = target_; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::VISIBILITY); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool start_; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool target_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(VisibilityTransition); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrightnessTransition -------------------------------------------------------- 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrightnessTransition : public LayerAnimationElement { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrightnessTransition(float target, base::TimeDelta duration) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrightnessTransition() {} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetBrightnessForAnimation(); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetBrightnessFromAnimation( 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, start_, target_)); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->brightness = target_; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::BRIGHTNESS); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(BrightnessTransition); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GrayscaleTransition --------------------------------------------------------- 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GrayscaleTransition : public LayerAnimationElement { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GrayscaleTransition(float target, base::TimeDelta duration) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(0.0f), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~GrayscaleTransition() {} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetGrayscaleForAnimation(); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetGrayscaleFromAnimation( 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, start_, target_)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->grayscale = target_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::GRAYSCALE); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float start_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const float target_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GrayscaleTransition); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ColorTransition ------------------------------------------------------------- 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ColorTransition : public LayerAnimationElement { 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColorTransition(SkColor target, base::TimeDelta duration) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LayerAnimationElement(GetProperties(), duration), 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_(SK_ColorBLACK), 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(target) { 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ColorTransition() {} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_ = delegate->GetColorForAnimation(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnProgress(double t, LayerAnimationDelegate* delegate) OVERRIDE { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->SetColorFromAnimation( 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColorSetARGB( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetA(start_)), 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetA(target_))), 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetR(start_)), 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetR(target_))), 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetG(start_)), 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetG(target_))), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tween::ValueBetween(t, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetB(start_)), 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(SkColorGetB(target_))))); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target->color = target_; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE {} 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static AnimatableProperties GetProperties() { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AnimatableProperties properties; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties.insert(LayerAnimationElement::COLOR); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return properties; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor start_; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor target_; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ColorTransition); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedLayerAnimationElement ----------------------------------------------- 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedLayerAnimationElement : public LayerAnimationElement { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement(const AnimatableProperties& properties, 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LayerAnimationElement(properties, duration) { 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedLayerAnimationElement() {} 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsThreaded() const OVERRIDE { 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (duration() != base::TimeDelta()); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit ThreadedLayerAnimationElement(const LayerAnimationElement& element) 39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : LayerAnimationElement(element) { 39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (t < 1.0) 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Started()) { 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnEnd(delegate); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RequestEffectiveStart( 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(animation_group_id()); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (duration() == base::TimeDelta()) { 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(requested_start_time()); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(base::TimeTicks()); 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation = CreateCCAnimation(); 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->set_needs_synchronized_start_time(true); 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->AddThreadedAnimation(animation.Pass()); 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedOpacityTransition --------------------------------------------------- 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedOpacityTransition : public ThreadedLayerAnimationElement { 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedOpacityTransition(float target, base::TimeDelta duration) 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_(0.0f), 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedOpacityTransition() {} 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(Tween::ValueBetween( 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tween::CalculateValue(tween_type(), last_progressed_fraction()), 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(target_); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FloatAnimationCurveAdapter(tween_type(), 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_, 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Opacity)); 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->opacity = target_; 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float target_; 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedTransformTransition ------------------------------------------------- 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedTransformTransition : public ThreadedLayerAnimationElement { 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedTransformTransition(const gfx::Transform& target, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedTransformTransition() {} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_ = Layer::ConvertTransformToCCTransform(start_, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_ = Layer::ConvertTransformToCCTransform(target_, 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 5247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (delegate && Started()) { 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(Tween::ValueBetween( 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tween::CalculateValue(tween_type(), last_progressed_fraction()), 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(target_); 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TransformAnimationCurveAdapter(tween_type(), 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_, 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Transform)); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = target_; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start_; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_start_; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform target_; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_target_; 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 57058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// InverseTransformTransision -------------------------------------------------- 57158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class InverseTransformTransition : public ThreadedLayerAnimationElement { 57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) InverseTransformTransition(const gfx::Transform& base_transform, 57558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement* uninverted_transition) 57658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : ThreadedLayerAnimationElement(*uninverted_transition), 57758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_(base_transform), 57858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uninverted_transition_(CheckAndCast(uninverted_transition)) { 57958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 58058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~InverseTransformTransition() {} 58158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 58358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 58458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform start(delegate->GetTransformForAnimation()); 58558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) effective_start_ = base_transform_ * start; 58658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 58758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TargetValue target; 58858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) uninverted_transition_->GetTargetValue(&target); 58958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_ = target.transform; 59058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) set_tween_type(uninverted_transition_->tween_type()); 59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 59458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_base_start = Layer::ConvertTransformToCCTransform( 59558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_, 59658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) device_scale_factor); 59758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_base_target = Layer::ConvertTransformToCCTransform( 59858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_, 59958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) device_scale_factor); 60058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TransformAnimationCurveAdapter base_curve(tween_type(), 60158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_base_start, 60258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc_base_target, 60358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration()); 60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform cc_start = Layer::ConvertTransformToCCTransform( 60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) start, device_scale_factor); 60758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_curve_.reset(new InverseTransformCurveAdapter( 60858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_curve, cc_start, duration())); 60958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) computed_target_transform_ = ComputeWithBaseTransform(effective_start_, 61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_); 61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 61358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 61458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (delegate && Started()) { 61558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 61658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delegate->SetTransformFromAnimation(ComputeCurrentTransform()); 61758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 61858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 61958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 62158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) delegate->SetTransformFromAnimation(computed_target_transform_); 62258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 62458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 62558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc::Animation::Create(animation_curve_->Clone(), 62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_id(), 62858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_group_id(), 62958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cc::Animation::Transform)); 63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return animation.Pass(); 63158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 63258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 63458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) target->transform = computed_target_transform_; 63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 63858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform ComputeCurrentTransform() const { 63958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_current = Tween::ValueBetween( 64058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Tween::CalculateValue(tween_type(), last_progressed_fraction()), 64158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_transform_, 64258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base_target_); 64358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return ComputeWithBaseTransform(effective_start_, base_current); 64458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 64558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 64658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform ComputeWithBaseTransform(gfx::Transform start, 64758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform target) const { 64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 64958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(target.GetInverse(&to_return)); 65058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) to_return.PreconcatTransform(start); 65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return; 65358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static AnimatableProperties GetProperties() { 65658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) AnimatableProperties properties; 65758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return properties; 65958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 66058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 66158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static const ThreadedTransformTransition* CheckAndCast( 66258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement* element) { 66358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const AnimatableProperties& properties = element->properties(); 66458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(properties.find(TRANSFORM) != properties.end()); 66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return static_cast<const ThreadedTransformTransition*>(element); 66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 66758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 66858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform effective_start_; 66958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform computed_target_transform_; 67058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform base_transform_; 67258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_target_; 67358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve_; 67558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const ThreadedTransformTransition* const uninverted_transition_; 67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 67858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(InverseTransformTransition); 67958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement::TargetValue ------------------------------------------ 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue() 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : opacity(0.0f), 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(false), 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(0.0f), 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(0.0f), 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(SK_ColorBLACK) { 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue( 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationDelegate* delegate) 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()), 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform(delegate ? 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->GetTransformForAnimation() : gfx::Transform()), 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f), 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(delegate ? delegate->GetVisibilityForAnimation() : false), 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f), 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f), 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(delegate ? delegate->GetColorForAnimation() : 0.0f) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement ------------------------------------------------------- 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : first_frame_(true), 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_(properties), 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) duration_(GetEffectiveDuration(duration)), 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tween_type_(Tween::LINEAR), 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id_(cc::AnimationIdProvider::NextAnimationId()), 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 72058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement &element) 72158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : first_frame_(element.first_frame_), 72258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) properties_(element.properties_), 72358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_(element.duration_), 72458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) tween_type_(element.tween_type_), 72558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_id_(cc::AnimationIdProvider::NextAnimationId()), 72658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) animation_group_id_(element.animation_group_id_), 72758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) last_progressed_fraction_(element.last_progressed_fraction_) { 72858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 72958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::~LayerAnimationElement() { 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int animation_group_id) { 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(first_frame_); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = animation_group_id; 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnStart(delegate); 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestEffectiveStart(delegate); 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = false; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::Progress(base::TimeTicks now, 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!first_frame_); 7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw; 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double t = 1.0; 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if ((effective_start_time_ == base::TimeTicks()) || 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (now < effective_start_time_)) { 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This hasn't actually started yet. 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_draw = false; 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = now - effective_start_time_; 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate); 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = t == 1.0; 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = t; 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsFinished(base::TimeTicks time, 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* total_duration) { 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If an effective start has been requested but the effective start time 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hasn't yet been set, the animation is not finished, regardless of the 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |time|. 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta queueing_delay; 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_) 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queueing_delay = effective_start_time_ - requested_start_time_; 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = time - requested_start_time_; 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elapsed >= duration_ + queueing_delay) { 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *total_duration = duration_ + queueing_delay; 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (first_frame_) 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStart(delegate); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw = OnProgress(1.0, delegate); 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 1.0; 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = true; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return need_draw; 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationElement::GetTargetValue(TargetValue* target) const { 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetTarget(target); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsThreaded() const { 8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAbort(delegate); 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_frame_ = true; 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::RequestEffectiveStart( 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) { 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time_ = requested_start_time_; 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::AnimatableProperty 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::ToAnimatableProperty( 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::TargetProperty property) { 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (property) { 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Transform: 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TRANSFORM; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Opacity: 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OPACITY; 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AnimatableProperty(); 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta LayerAnimationElement::GetEffectiveDuration( 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta& duration) { 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) { 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::NORMAL_DURATION: 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration; 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::FAST_DURATION: 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration / kFastDurationScaleFactor; 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::SLOW_DURATION: 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration * kSlowDurationScaleFactor; 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::ZERO_DURATION: 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateTransformElement( 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Transform& transform, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedTransformTransition(transform, duration); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 85858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateInverseTransformElement( 85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Transform& base_transform, 86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const LayerAnimationElement* uninverted_transition) { 86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return new InverseTransformTransition(base_transform, uninverted_transition); 86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 86458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// static 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::CreateInterpolatedTransformElement( 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterpolatedTransform* interpolated_transform, 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new InterpolatedTransformTransition(interpolated_transform, duration); 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BoundsTransition(bounds, duration); 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float opacity, 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedOpacityTransition(opacity, duration); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool visibility, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new VisibilityTransition(visibility, duration); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement( 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float brightness, 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BrightnessTransition(brightness, duration); 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement( 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float grayscale, 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new GrayscaleTransition(grayscale, duration); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreatePauseElement( 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Pause(properties, duration); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateColorElement( 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ColorTransition(color, duration); 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 922