Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Unified Diff: ui/gfx/interpolated_transform.h

Issue 7262024: Interpolated transforms (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Gardened patch Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform.cc » ('j') | ui/gfx/interpolated_transform_unittest.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « no previous file | ui/gfx/interpolated_transform.cc » ('j') | ui/gfx/interpolated_transform_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698