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