layer_animation_element.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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: 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnProgress(double t, 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (t < 1.0) 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (Started()) { 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnEnd(delegate); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->RemoveThreadedAnimation(animation_id()); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RequestEffectiveStart( 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) OVERRIDE { 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(animation_group_id()); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (duration() == base::TimeDelta()) { 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(requested_start_time()); 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_effective_start_time(base::TimeTicks()); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation = CreateCCAnimation(); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation->set_needs_synchronized_start_time(true); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->AddThreadedAnimation(animation.Pass()); 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) = 0; 4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() = 0; 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedLayerAnimationElement); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedOpacityTransition --------------------------------------------------- 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedOpacityTransition : public ThreadedLayerAnimationElement { 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedOpacityTransition(float target, base::TimeDelta duration) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_(0.0f), 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedOpacityTransition() {} 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetOpacityForAnimation(); 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && Started()) { 4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(Tween::ValueBetween( 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tween::CalculateValue(tween_type(), last_progressed_fraction()), 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetOpacityFromAnimation(target_); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new FloatAnimationCurveAdapter(tween_type(), 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_, 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Opacity)); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->opacity = target_; 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::OPACITY); 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float start_; 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float target_; 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedOpacityTransition); 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ThreadedTransformTransition ------------------------------------------------- 4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ThreadedTransformTransition : public ThreadedLayerAnimationElement { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedTransformTransition(const gfx::Transform& target, 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : ThreadedLayerAnimationElement(GetProperties(), duration), 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_(target) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~ThreadedTransformTransition() {} 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnStart(LayerAnimationDelegate* delegate) OVERRIDE { 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_ = delegate->GetTransformForAnimation(); 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = delegate->GetBoundsForAnimation(); 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float device_scale_factor = delegate->GetDeviceScaleFactor(); 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_ = Layer::ConvertTransformToCCTransform(start_, 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds, 5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_ = Layer::ConvertTransformToCCTransform(target_, 5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds, 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) device_scale_factor); 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAbort(LayerAnimationDelegate* delegate) OVERRIDE { 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (delegate && animation_id()) { 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ThreadedLayerAnimationElement::OnAbort(delegate); 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(Tween::ValueBetween( 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tween::CalculateValue(tween_type(), last_progressed_fraction()), 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) start_, 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_)); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnEnd(LayerAnimationDelegate* delegate) OVERRIDE { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delegate->SetTransformFromAnimation(target_); 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::Animation> CreateCCAnimation() OVERRIDE { 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::AnimationCurve> animation_curve( 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TransformAnimationCurveAdapter(tween_type(), 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_start_, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc_target_, 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration())); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::Animation> animation( 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Create(animation_curve.Pass(), 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id(), 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id(), 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::Transform)); 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return animation.Pass(); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGetTarget(TargetValue* target) const OVERRIDE { 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->transform = target_; 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static AnimatableProperties GetProperties() { 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AnimatableProperties properties; 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) properties.insert(LayerAnimationElement::TRANSFORM); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return properties; 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform start_; 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_start_; 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform target_; 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform cc_target_; 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadedTransformTransition); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement::TargetValue ------------------------------------------ 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue() 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : opacity(0.0f), 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(false), 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(0.0f), 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(0.0f), 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(SK_ColorBLACK) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::TargetValue::TargetValue( 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LayerAnimationDelegate* delegate) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : bounds(delegate ? delegate->GetBoundsForAnimation() : gfx::Rect()), 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) transform(delegate ? 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate->GetTransformForAnimation() : gfx::Transform()), 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) opacity(delegate ? delegate->GetOpacityForAnimation() : 0.0f), 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) visibility(delegate ? delegate->GetVisibilityForAnimation() : false), 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brightness(delegate ? delegate->GetBrightnessForAnimation() : 0.0f), 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) grayscale(delegate ? delegate->GetGrayscaleForAnimation() : 0.0f), 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) color(delegate ? delegate->GetColorForAnimation() : 0.0f) { 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LayerAnimationElement ------------------------------------------------------- 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::LayerAnimationElement( 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : first_frame_(true), 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties_(properties), 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) duration_(GetEffectiveDuration(duration)), 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tween_type_(Tween::LINEAR), 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_id_(cc::AnimationIdProvider::NextAnimationId()), 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_(0), 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_(0.0) { 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::~LayerAnimationElement() { 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Start(LayerAnimationDelegate* delegate, 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int animation_group_id) { 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(first_frame_); 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) animation_group_id_ = animation_group_id; 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnStart(delegate); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RequestEffectiveStart(delegate); 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = false; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::Progress(base::TimeTicks now, 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LayerAnimationDelegate* delegate) { 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!first_frame_); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw; 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double t = 1.0; 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (effective_start_time_ == base::TimeTicks()) { 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This hasn't actually started yet. 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_draw = false; 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 0.0; 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = now - effective_start_time_; 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((duration_ > base::TimeDelta()) && (elapsed < duration_)) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) t = elapsed.InMillisecondsF() / duration_.InMillisecondsF(); 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_draw = OnProgress(Tween::CalculateValue(tween_type_, t), delegate); 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = t == 1.0; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = t; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return need_draw; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsFinished(base::TimeTicks time, 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* total_duration) { 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If an effective start has been requested but the effective start time 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hasn't yet been set, the animation is not finished, regardless of the 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |time|. 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_ && (effective_start_time_ == base::TimeTicks())) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta queueing_delay; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!first_frame_) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) queueing_delay = effective_start_time_ - requested_start_time_; 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta elapsed = time - requested_start_time_; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (elapsed >= duration_ + queueing_delay) { 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *total_duration = duration_ + queueing_delay; 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::ProgressToEnd(LayerAnimationDelegate* delegate) { 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (first_frame_) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnStart(delegate); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_draw = OnProgress(1.0, delegate); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_progressed_fraction_ = 1.0; 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) first_frame_ = true; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return need_draw; 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LayerAnimationElement::GetTargetValue(TargetValue* target) const { 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnGetTarget(target); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool LayerAnimationElement::IsThreaded() const { 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::Abort(LayerAnimationDelegate* delegate) { 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OnAbort(delegate); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_frame_ = true; 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void LayerAnimationElement::RequestEffectiveStart( 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LayerAnimationDelegate* delegate) { 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(requested_start_time_ != base::TimeTicks()); 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) effective_start_time_ = requested_start_time_; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::AnimatableProperty 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)LayerAnimationElement::ToAnimatableProperty( 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cc::Animation::TargetProperty property) { 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (property) { 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Transform: 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return TRANSFORM; 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case cc::Animation::Opacity: 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return OPACITY; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return AnimatableProperty(); 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta LayerAnimationElement::GetEffectiveDuration( 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta& duration) { 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (ScopedAnimationDurationScaleMode::duration_scale_mode()) { 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::NORMAL_DURATION: 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration; 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::FAST_DURATION: 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration / kFastDurationScaleFactor; 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::SLOW_DURATION: 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration * kSlowDurationScaleFactor; 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ScopedAnimationDurationScaleMode::ZERO_DURATION: 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) default: 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::TimeDelta(); 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateTransformElement( 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Transform& transform, 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedTransformTransition(transform, duration); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement::CreateInterpolatedTransformElement( 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InterpolatedTransform* interpolated_transform, 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new InterpolatedTransformTransition(interpolated_transform, duration); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBoundsElement( 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BoundsTransition(bounds, duration); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateOpacityElement( 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float opacity, 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return new ThreadedOpacityTransition(opacity, duration); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateVisibilityElement( 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool visibility, 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new VisibilityTransition(visibility, duration); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateBrightnessElement( 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float brightness, 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new BrightnessTransition(brightness, duration); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateGrayscaleElement( 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float grayscale, 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new GrayscaleTransition(grayscale, duration); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreatePauseElement( 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AnimatableProperties& properties, 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new Pause(properties, duration); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LayerAnimationElement* LayerAnimationElement::CreateColorElement( 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor color, 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta duration) { 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new ColorTransition(color, duration); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 791