transform_animation_curve_adapter.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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( 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 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_, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Tween::CalculateValue(tween_type_, progress)); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::ComposeTransform(to_return); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool TransformAnimationCurveAdapter::AnimatedBoundsForBox( 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const gfx::BoxF& box, 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) gfx::BoxF* bounds) const { 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // computing bounds for TransformOperationMatrix, use that to compute 593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // the bounds we need here. 603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return false; 613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::InverseTransformCurveAdapter( 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TransformAnimationCurveAdapter base_curve, 6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform initial_value, 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::TimeDelta duration) 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : base_curve_(base_curve), 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_(initial_value), 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_(duration) { 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) effective_initial_value_ = base_curve_.GetValue(0.0) * initial_value_; 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)InverseTransformCurveAdapter::~InverseTransformCurveAdapter() { 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)double InverseTransformCurveAdapter::Duration() const { 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return duration_.InSeconds(); 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)scoped_ptr<cc::AnimationCurve> InverseTransformCurveAdapter::Clone() const { 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<InverseTransformCurveAdapter> to_return( 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) new InverseTransformCurveAdapter(base_curve_, 8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_value_, 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) duration_)); 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return.PassAs<cc::AnimationCurve>(); 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)gfx::Transform InverseTransformCurveAdapter::GetValue( 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) double t) const { 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (t <= 0.0) 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return initial_value_; 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform base_transform = base_curve_.GetValue(t); 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Invert base 9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Transform to_return(gfx::Transform::kSkipInitialization); 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool is_invertible = base_transform.GetInverse(&to_return); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DCHECK(is_invertible); 9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) to_return.PreconcatTransform(effective_initial_value_); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return to_return; 10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool InverseTransformCurveAdapter::AnimatedBoundsForBox( 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::BoxF& box, 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::BoxF* bounds) const { 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // TODO(ajuma): Once cc::TransformOperation::BlendedBoundsForBox supports 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // computing bounds for TransformOperationMatrix, use that to compute 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // the bounds we need here. 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return false; 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ui 113