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