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