transform_animation_curve_adapter.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/transform_animation_curve_adapter.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ui { 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TransformAnimationCurveAdapter::TransformAnimationCurveAdapter( 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::Type tween_type, 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform initial_value, 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform target_value, 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta duration) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : tween_type_(tween_type), 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_value_(initial_value), 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_value_(target_value), 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration_(duration) { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposeTransform(&decomposed_initial_value_, initial_value_); 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposeTransform(&decomposed_target_value_, target_value_); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TransformAnimationCurveAdapter::~TransformAnimationCurveAdapter() { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)double TransformAnimationCurveAdapter::Duration() const { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return duration_.InSecondsF(); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)scoped_ptr<cc::AnimationCurve> TransformAnimationCurveAdapter::Clone() const { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<TransformAnimationCurveAdapter> to_return( 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new TransformAnimationCurveAdapter(tween_type_, 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) initial_value_, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target_value_, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) duration_)); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return to_return.PassAs<cc::AnimationCurve>(); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Transform TransformAnimationCurveAdapter::GetValue( 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double t) const { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (t >= duration_.InSecondsF()) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return target_value_; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (t <= 0.0) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return initial_value_; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double progress = t / duration_.InSecondsF(); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform to_return; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::BlendDecomposedTransforms(&to_return, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_target_value_, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decomposed_initial_value_, 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) gfx::Tween::CalculateValue(tween_type_, 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) progress)); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ComposeTransform(to_return); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool TransformAnimationCurveAdapter::AnimatedBoundsForBox( 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const gfx::BoxF& box, 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gfx::BoxF* bounds) const { 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // computing bounds for TransformOperationMatrix, use that to compute 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the bounds we need here. 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 64e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool TransformAnimationCurveAdapter::AffectsScale() const { 65e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return !initial_value_.IsIdentityOrTranslation() || 66e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch !target_value_.IsIdentityOrTranslation(); 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 68e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::InverseTransformCurveAdapter( 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TransformAnimationCurveAdapter base_curve, 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform initial_value, 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta duration) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : base_curve_(base_curve), 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_(initial_value), 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_(duration) { 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_; 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::~InverseTransformCurveAdapter() { 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)double InverseTransformCurveAdapter::Duration() const { 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return duration_.InSeconds(); 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const { 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<InverseTransformCurveAdapter> to_return( 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InverseTransformCurveAdapter(base_curve_, 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_, 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_)); 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return.PassAs<cc::AnimationCurve>(); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Transform InverseTransformCurveAdapter::GetValue( 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) double t) const { 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (t <= 0.0) 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return initial_value_; 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_transform = base_curve_.GetValue(t); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Invert base 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool is_invertible = base_transform.GetInverse(&to_return); 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(is_invertible); 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) to_return.PreconcatTransform(effective_initial_value_); 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool InverseTransformCurveAdapter::AnimatedBoundsForBox( 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::BoxF& box, 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::BoxF* bounds) const { 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // computing bounds for TransformOperationMatrix, use that to compute 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the bounds we need here. 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 118e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool InverseTransformCurveAdapter::AffectsScale() const { 119e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return !initial_value_.IsIdentityOrTranslation() || 120e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base_curve_.AffectsScale(); 121e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 122e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ui 124