15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_GFX_INTERPOLATED_TRANSFORM_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_GFX_INTERPOLATED_TRANSFORM_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector3d_f.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedTransform
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Abstract base class for transforms that animate over time. These
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interpolated transforms can be combined to allow for more sophisticated
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// animations. For example, you might combine a rotation of 90 degrees between
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// times 0 and 1, with a scale from 1 to 0.3 between times 0 and 0.25 and a
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scale from 0.3 to 1 from between times 0.75 and 1.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedTransform {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTransform();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The interpolated transform varies only when t in (start_time, end_time).
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If t <= start_time, Interpolate(t) will return the initial transform, and
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if t >= end_time, Interpolate(t) will return the final transform.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTransform(float start_time, float end_time);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedTransform();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the interpolated transform at time t. Note: not virtual.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Transform Interpolate(float t) const;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Intepolate ultimately returns the product of our transform at time t
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and our child's transform at time t (if we have one).
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This function takes ownership of the passed InterpolatedTransform.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetChild(InterpolatedTransform* child);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the interpolated transform is reversed, Interpolate(t) will return
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interpolate(1 - t)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetReversed(bool reversed) { reversed_ = reversed; }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Reversed() const { return reversed_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculates the interpolated transform without considering our child.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const = 0;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If time in (start_time_, end_time_], this function linearly interpolates
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // between start_value and end_value.  More precisely it returns
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (1 - t) * start_value + t * end_value where
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // t = (start_time_ - time) / (end_time_ - start_time_).
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If time < start_time_ it returns start_value, and if time >= end_time_
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it returns end_value.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float ValueBetween(float time, float start_value, float end_value) const;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float start_time() const { return start_time_; }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float end_time() const { return end_time_; }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float start_time_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float end_time_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The child transform. If you consider an interpolated transform as a
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function of t. If, without a child, we are f(t), and our child is
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // g(t), then with a child we become f'(t) = f(t) * g(t). Using a child
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // transform, we can chain collections of transforms together.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InterpolatedTransform> child_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool reversed_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedTransform);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedRotation
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents an animated rotation.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedRotation : public InterpolatedTransform {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedRotation(float start_degrees, float end_degrees);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedRotation(float start_degrees,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float end_degrees,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float start_time,
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float end_time);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedRotation();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float start_degrees_;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float end_degrees_;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedRotation);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedAxisAngleRotation
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents an animated rotation.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedAxisAngleRotation : public InterpolatedTransform {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterpolatedAxisAngleRotation(const gfx::Vector3dF& axis,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float start_degrees,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float end_degrees);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterpolatedAxisAngleRotation(const gfx::Vector3dF& axis,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float start_degrees,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float end_degrees,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float start_time,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                float end_time);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedAxisAngleRotation();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector3dF axis_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float start_degrees_;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const float end_degrees_;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedAxisAngleRotation);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedScale
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents an animated scale.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedScale : public InterpolatedTransform {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedScale(float start_scale, float end_scale);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedScale(float start_scale, float end_scale,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    float start_time, float end_time);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedScale(const gfx::Point3F& start_scale,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const gfx::Point3F& end_scale);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedScale(const gfx::Point3F& start_scale,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    const gfx::Point3F& end_scale,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    float start_time,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    float end_time);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedScale();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point3F start_scale_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point3F end_scale_;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedScale);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedTranslation : public InterpolatedTransform {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTranslation(const gfx::Point& start_pos,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Point& end_pos);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTranslation(const gfx::Point& start_pos,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Point& end_pos,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          float start_time,
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          float end_time);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedTranslation();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point start_pos_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Point end_pos_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedTranslation);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedConstantTransform
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents a transform that is constant over time. This is only useful when
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// composed with other interpolated transforms.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See InterpolatedTransformAboutPivot for an example of its usage.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedConstantTransform : public InterpolatedTransform {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit InterpolatedConstantTransform(const gfx::Transform& transform);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedConstantTransform();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const gfx::Transform transform_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedConstantTransform);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// class InterpolatedTransformAboutPivot
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Represents an animated transform with a transformed origin. Essentially,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at each time, t, the interpolated transform is created by composing
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// P * T * P^-1 where P is a constant transform to the new origin.
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedTransformAboutPivot
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : public InterpolatedTransform {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of the passed transform.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTransformAboutPivot(const gfx::Point& pivot,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  InterpolatedTransform* transform);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of the passed transform.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterpolatedTransformAboutPivot(const gfx::Point& pivot,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  InterpolatedTransform* transform,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  float start_time,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  float end_time);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InterpolatedTransformAboutPivot();
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(const gfx::Point& pivot, InterpolatedTransform* transform);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InterpolatedTransform> transform_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformAboutPivot);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GFX_EXPORT InterpolatedMatrixTransform : public InterpolatedTransform {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterpolatedMatrixTransform(const gfx::Transform& start_transform,
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const gfx::Transform& end_transform);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterpolatedMatrixTransform(const gfx::Transform& start_transform,
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const gfx::Transform& end_transform,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              float start_time,
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              float end_time);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~InterpolatedMatrixTransform();
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual gfx::Transform InterpolateButDoNotCompose(float t) const OVERRIDE;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Init(const gfx::Transform& start_transform,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const gfx::Transform& end_transform);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform start_decomp_;
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform end_decomp_;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_GFX_INTERPOLATED_TRANSFORM_H_
266