transform_animation_curve_adapter.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TransformAnimationCurveAdapter::IsTranslation() const { 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return initial_value_.IsIdentityOrTranslation() && 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch target_value_.IsIdentityOrTranslation(); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool TransformAnimationCurveAdapter::MaximumScale(float* max_scale) const { 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::InverseTransformCurveAdapter( 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TransformAnimationCurveAdapter base_curve, 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform initial_value, 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta duration) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : base_curve_(base_curve), 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_(initial_value), 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_(duration) { 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_; 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::~InverseTransformCurveAdapter() { 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)double InverseTransformCurveAdapter::Duration() const { 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return duration_.InSeconds(); 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const { 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<InverseTransformCurveAdapter> to_return( 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InverseTransformCurveAdapter(base_curve_, 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_, 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_)); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return.PassAs<cc::AnimationCurve>(); 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Transform InverseTransformCurveAdapter::GetValue( 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) double t) const { 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (t <= 0.0) 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return initial_value_; 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_transform = base_curve_.GetValue(t); 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Invert base 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool is_invertible = base_transform.GetInverse(&to_return); 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(is_invertible); 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) to_return.PreconcatTransform(effective_initial_value_); 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return; 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool InverseTransformCurveAdapter::AnimatedBoundsForBox( 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::BoxF& box, 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::BoxF* bounds) const { 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // computing bounds for TransformOperationMatrix, use that to compute 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the bounds we need here. 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 127e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochbool InverseTransformCurveAdapter::AffectsScale() const { 128e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return !initial_value_.IsIdentityOrTranslation() || 129e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base_curve_.AffectsScale(); 130e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 131e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool InverseTransformCurveAdapter::IsTranslation() const { 133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return initial_value_.IsIdentityOrTranslation() && 134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base_curve_.IsTranslation(); 135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbool InverseTransformCurveAdapter::MaximumScale(float* max_scale) const { 138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return false; 139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} 140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ui 142