Index: ui/gfx/interpolated_transform.h |
diff --git a/ui/gfx/interpolated_transform.h b/ui/gfx/interpolated_transform.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2a0a6b55e2cd49db00af90126a538e7c86e5d35f |
--- /dev/null |
+++ b/ui/gfx/interpolated_transform.h |
@@ -0,0 +1,195 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef UI_GFX_INTERPOLATED_TRANSFORM_H_ |
+#define UI_GFX_INTERPOLATED_TRANSFORM_H_ |
+#pragma once |
+ |
+#include "ui/gfx/transform.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "ui/gfx/point.h" |
+ |
+namespace ui { |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// class InterpolatedTransform |
+// |
+// Abstract base class for transforms that animate over time. These |
+// interpolated transforms can be combined to allow for more sophisticated |
+// animations. For example, you might combine a rotation of 90 degrees between |
+// times 0 and 1, with a scale from 1 to 0.3 between times 0 and 0.25 and a |
+// scale from 0.3 to 1 from between times 0.75 and 1. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+class InterpolatedTransform { |
+ public: |
+ InterpolatedTransform(); |
+ // The interpolated transform varies only when t in (start_time, end_time). |
+ // If t <= start_time, Interpolate(t) will return the initial transform, and |
+ // if t >= end_time, Interpolate(t) will return the final transform. |
+ InterpolatedTransform(float start_time, float end_time); |
+ virtual ~InterpolatedTransform(); |
+ |
+ // Returns the interpolated transform at time t. Note: not virtual. |
+ ui::Transform Interpolate(float t) const; |
+ |
+ // The Intepolate ultimately returns the product of our transform at time t |
+ // and our child's transform at time t (if we have one). |
+ // |
+ // This function takes ownership of the passed InterpolatedTransform. |
+ void SetChild(InterpolatedTransform* child); |
+ |
+ protected: |
+ // Calculates the interpolated transform without considering our child. |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const = 0; |
+ |
+ // If time in (start_time_, end_time_], this function linearly interpolates |
+ // between start_value and end_value. More precisely it returns |
+ // (1 - t) * start_value + t * end_value where |
+ // t = (start_time_ - time) / (end_time_ - start_time_). |
+ // If time < start_time_ it returns start_value, and if time >= end_time_ |
+ // it returns end_value. |
+ float ValueBetween(float time, float start_value, float end_value) const; |
+ |
+ private: |
+ const float start_time_; |
+ const float end_time_; |
+ |
+ // The child transform. If you consider an interpolated transform as a |
+ // function of t. If, without a child, we are f(t), and our child is |
+ // g(t), then with a child we become f'(t) = f(t) * g(t). Using a child |
+ // transform, we can chain collections of transforms together. |
+ scoped_ptr<InterpolatedTransform> child_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedTransform); |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// class InterpolatedRotation |
+// |
+// Represents an animated rotation. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+class InterpolatedRotation : public InterpolatedTransform { |
+ public: |
+ InterpolatedRotation(float start_degrees, float end_degrees); |
+ InterpolatedRotation(float start_degrees, |
+ float end_degrees, |
+ float start_time, |
+ float end_time); |
+ virtual ~InterpolatedRotation(); |
+ |
+ protected: |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const OVERRIDE; |
+ |
+ private: |
+ const float start_degrees_; |
+ const float end_degrees_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedRotation); |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// class InterpolatedScale |
+// |
+// Represents an animated scale. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+class InterpolatedScale : public InterpolatedTransform { |
+ public: |
+ InterpolatedScale(float start_scale, float end_scale); |
+ InterpolatedScale(float start_scale, |
+ float end_scale, |
+ float start_time, |
+ float end_time); |
+ virtual ~InterpolatedScale(); |
+ |
+ protected: |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const OVERRIDE; |
+ |
+ private: |
+ const float start_scale_; |
+ const float end_scale_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedScale); |
+}; |
+ |
+class InterpolatedTranslation : public InterpolatedTransform { |
+ public: |
+ InterpolatedTranslation(const gfx::Point& start_pos, |
+ const gfx::Point& end_pos); |
+ InterpolatedTranslation(const gfx::Point& start_pos, |
+ const gfx::Point& end_pos, |
+ float start_time, |
+ float end_time); |
+ virtual ~InterpolatedTranslation(); |
+ |
+ protected: |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const OVERRIDE; |
+ |
+ private: |
+ const gfx::Point start_pos_; |
+ const gfx::Point end_pos_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedTranslation); |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// class InterpolatedConstantTransform |
+// |
+// Represents a transform that is constant over time. This is only useful when |
+// composed with other interpolated transforms. |
+// |
+// See InterpolatedTransformAboutPivot for an example of its usage. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+class InterpolatedConstantTransform : public InterpolatedTransform { |
+ public: |
+ InterpolatedConstantTransform(const ui::Transform& transform); |
+ virtual ~InterpolatedConstantTransform(); |
+ |
+ protected: |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const OVERRIDE; |
+ |
+ private: |
+ const ui::Transform transform_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedConstantTransform); |
+}; |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+// class InterpolatedTransformAboutPivot |
+// |
+// Represents an animated transform with a transformed origin. Essentially, |
+// at each time, t, the interpolated transform is created by composing |
+// P * T * P^-1 where P is a constant transform to the new origin. |
+// |
+/////////////////////////////////////////////////////////////////////////////// |
+class InterpolatedTransformAboutPivot : public InterpolatedTransform { |
+ public: |
+ // Takes ownership of the passed transform. |
+ InterpolatedTransformAboutPivot(const gfx::Point& pivot, |
+ InterpolatedTransform* transform); |
+ |
+ // Takes ownership of the passed transform. |
+ InterpolatedTransformAboutPivot(const gfx::Point& pivot, |
+ InterpolatedTransform* transform, |
+ float start_time, |
+ float end_time); |
+ virtual ~InterpolatedTransformAboutPivot(); |
+ |
+ protected: |
+ virtual ui::Transform InterpolateButDoNotCompose(float t) const OVERRIDE; |
+ |
+ private: |
+ void Init(const gfx::Point& pivot, InterpolatedTransform* transform); |
+ |
+ scoped_ptr<InterpolatedTransform> transform_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(InterpolatedTransformAboutPivot); |
+}; |
+ |
+} // namespace ui |
+ |
+#endif // UI_GFX_INTERPOLATED_TRANSFORM_H_ |