| Index: ui/gfx/interpolated_transform.cc
|
| diff --git a/ui/gfx/interpolated_transform.cc b/ui/gfx/interpolated_transform.cc
|
| deleted file mode 100644
|
| index 693b6567f7f53f01b266818001cf7d188f011f86..0000000000000000000000000000000000000000
|
| --- a/ui/gfx/interpolated_transform.cc
|
| +++ /dev/null
|
| @@ -1,384 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "ui/gfx/interpolated_transform.h"
|
| -
|
| -#include <cmath>
|
| -
|
| -#ifndef M_PI
|
| -#define M_PI 3.14159265358979323846
|
| -#endif
|
| -
|
| -#include "base/logging.h"
|
| -#include "ui/gfx/animation/tween.h"
|
| -
|
| -namespace {
|
| -
|
| -static const double EPSILON = 1e-6;
|
| -
|
| -bool IsMultipleOfNinetyDegrees(double degrees) {
|
| - double remainder = fabs(fmod(degrees, 90.0));
|
| - return remainder < EPSILON || 90.0 - remainder < EPSILON;
|
| -}
|
| -
|
| -// Returns false if |degrees| is not a multiple of ninety degrees or if
|
| -// |rotation| is NULL. It does not affect |rotation| in this case. Otherwise
|
| -// *rotation is set to be the appropriate sanitized rotation matrix. That is,
|
| -// the rotation matrix corresponding to |degrees| which has entries that are all
|
| -// either 0, 1 or -1.
|
| -bool MassageRotationIfMultipleOfNinetyDegrees(gfx::Transform* rotation,
|
| - float degrees) {
|
| - if (!IsMultipleOfNinetyDegrees(degrees) || !rotation)
|
| - return false;
|
| -
|
| - gfx::Transform transform;
|
| - SkMatrix44& m = transform.matrix();
|
| - float degrees_by_ninety = degrees / 90.0f;
|
| -
|
| - int n = static_cast<int>(degrees_by_ninety > 0
|
| - ? floor(degrees_by_ninety + 0.5f)
|
| - : ceil(degrees_by_ninety - 0.5f));
|
| -
|
| - n %= 4;
|
| - if (n < 0)
|
| - n += 4;
|
| -
|
| - // n should now be in the range [0, 3]
|
| - if (n == 1) {
|
| - m.set3x3( 0, 1, 0,
|
| - -1, 0, 0,
|
| - 0, 0, 1);
|
| - } else if (n == 2) {
|
| - m.set3x3(-1, 0, 0,
|
| - 0, -1, 0,
|
| - 0, 0, 1);
|
| - } else if (n == 3) {
|
| - m.set3x3( 0, -1, 0,
|
| - 1, 0, 0,
|
| - 0, 0, 1);
|
| - }
|
| -
|
| - *rotation = transform;
|
| - return true;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace ui {
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedTransform
|
| -//
|
| -
|
| -InterpolatedTransform::InterpolatedTransform()
|
| - : start_time_(0.0f),
|
| - end_time_(1.0f),
|
| - reversed_(false) {
|
| -}
|
| -
|
| -InterpolatedTransform::InterpolatedTransform(float start_time,
|
| - float end_time)
|
| - : start_time_(start_time),
|
| - end_time_(end_time),
|
| - reversed_(false) {
|
| -}
|
| -
|
| -InterpolatedTransform::~InterpolatedTransform() {}
|
| -
|
| -gfx::Transform InterpolatedTransform::Interpolate(float t) const {
|
| - if (reversed_)
|
| - t = 1.0f - t;
|
| - gfx::Transform result = InterpolateButDoNotCompose(t);
|
| - if (child_.get()) {
|
| - result.ConcatTransform(child_->Interpolate(t));
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -void InterpolatedTransform::SetChild(InterpolatedTransform* child) {
|
| - child_.reset(child);
|
| -}
|
| -
|
| -inline float InterpolatedTransform::ValueBetween(float time,
|
| - float start_value,
|
| - float end_value) const {
|
| - // can't handle NaN
|
| - DCHECK(time == time && start_time_ == start_time_ && end_time_ == end_time_);
|
| - if (time != time || start_time_ != start_time_ || end_time_ != end_time_)
|
| - return start_value;
|
| -
|
| - // Ok if equal -- we'll get a step function. Note: if end_time_ ==
|
| - // start_time_ == x, then if none of the numbers are NaN, then it
|
| - // must be true that time < x or time >= x, so we will return early
|
| - // due to one of the following if statements.
|
| - DCHECK(end_time_ >= start_time_);
|
| -
|
| - if (time < start_time_)
|
| - return start_value;
|
| -
|
| - if (time >= end_time_)
|
| - return end_value;
|
| -
|
| - float t = (time - start_time_) / (end_time_ - start_time_);
|
| - return static_cast<float>(
|
| - gfx::Tween::DoubleValueBetween(t, start_value, end_value));
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedRotation
|
| -//
|
| -
|
| -InterpolatedRotation::InterpolatedRotation(float start_degrees,
|
| - float end_degrees)
|
| - : InterpolatedTransform(),
|
| - start_degrees_(start_degrees),
|
| - end_degrees_(end_degrees) {
|
| -}
|
| -
|
| -InterpolatedRotation::InterpolatedRotation(float start_degrees,
|
| - float end_degrees,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - start_degrees_(start_degrees),
|
| - end_degrees_(end_degrees) {
|
| -}
|
| -
|
| -InterpolatedRotation::~InterpolatedRotation() {}
|
| -
|
| -gfx::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const {
|
| - gfx::Transform result;
|
| - float interpolated_degrees = ValueBetween(t, start_degrees_, end_degrees_);
|
| - result.Rotate(interpolated_degrees);
|
| - if (t == 0.0f || t == 1.0f)
|
| - MassageRotationIfMultipleOfNinetyDegrees(&result, interpolated_degrees);
|
| - return result;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedAxisAngleRotation
|
| -//
|
| -
|
| -InterpolatedAxisAngleRotation::InterpolatedAxisAngleRotation(
|
| - const gfx::Vector3dF& axis,
|
| - float start_degrees,
|
| - float end_degrees)
|
| - : InterpolatedTransform(),
|
| - axis_(axis),
|
| - start_degrees_(start_degrees),
|
| - end_degrees_(end_degrees) {
|
| -}
|
| -
|
| -InterpolatedAxisAngleRotation::InterpolatedAxisAngleRotation(
|
| - const gfx::Vector3dF& axis,
|
| - float start_degrees,
|
| - float end_degrees,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - axis_(axis),
|
| - start_degrees_(start_degrees),
|
| - end_degrees_(end_degrees) {
|
| -}
|
| -
|
| -InterpolatedAxisAngleRotation::~InterpolatedAxisAngleRotation() {}
|
| -
|
| -gfx::Transform
|
| -InterpolatedAxisAngleRotation::InterpolateButDoNotCompose(float t) const {
|
| - gfx::Transform result;
|
| - result.RotateAbout(axis_, ValueBetween(t, start_degrees_, end_degrees_));
|
| - return result;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedScale
|
| -//
|
| -
|
| -InterpolatedScale::InterpolatedScale(float start_scale, float end_scale)
|
| - : InterpolatedTransform(),
|
| - start_scale_(gfx::Point3F(start_scale, start_scale, start_scale)),
|
| - end_scale_(gfx::Point3F(end_scale, end_scale, end_scale)) {
|
| -}
|
| -
|
| -InterpolatedScale::InterpolatedScale(float start_scale, float end_scale,
|
| - float start_time, float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - start_scale_(gfx::Point3F(start_scale, start_scale, start_scale)),
|
| - end_scale_(gfx::Point3F(end_scale, end_scale, end_scale)) {
|
| -}
|
| -
|
| -InterpolatedScale::InterpolatedScale(const gfx::Point3F& start_scale,
|
| - const gfx::Point3F& end_scale)
|
| - : InterpolatedTransform(),
|
| - start_scale_(start_scale),
|
| - end_scale_(end_scale) {
|
| -}
|
| -
|
| -InterpolatedScale::InterpolatedScale(const gfx::Point3F& start_scale,
|
| - const gfx::Point3F& end_scale,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - start_scale_(start_scale),
|
| - end_scale_(end_scale) {
|
| -}
|
| -
|
| -InterpolatedScale::~InterpolatedScale() {}
|
| -
|
| -gfx::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const {
|
| - gfx::Transform result;
|
| - float scale_x = ValueBetween(t, start_scale_.x(), end_scale_.x());
|
| - float scale_y = ValueBetween(t, start_scale_.y(), end_scale_.y());
|
| - float scale_z = ValueBetween(t, start_scale_.z(), end_scale_.z());
|
| - result.Scale3d(scale_x, scale_y, scale_z);
|
| - return result;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedTranslation
|
| -//
|
| -
|
| -InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
|
| - const gfx::Point& end_pos)
|
| - : InterpolatedTransform(),
|
| - start_pos_(start_pos),
|
| - end_pos_(end_pos) {
|
| -}
|
| -
|
| -InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos,
|
| - const gfx::Point& end_pos,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - start_pos_(start_pos),
|
| - end_pos_(end_pos) {
|
| -}
|
| -
|
| -InterpolatedTranslation::InterpolatedTranslation(const gfx::Point3F& start_pos,
|
| - const gfx::Point3F& end_pos)
|
| - : InterpolatedTransform(), start_pos_(start_pos), end_pos_(end_pos) {
|
| -}
|
| -
|
| -InterpolatedTranslation::InterpolatedTranslation(const gfx::Point3F& start_pos,
|
| - const gfx::Point3F& end_pos,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform(start_time, end_time),
|
| - start_pos_(start_pos),
|
| - end_pos_(end_pos) {
|
| -}
|
| -
|
| -InterpolatedTranslation::~InterpolatedTranslation() {}
|
| -
|
| -gfx::Transform
|
| -InterpolatedTranslation::InterpolateButDoNotCompose(float t) const {
|
| - gfx::Transform result;
|
| - result.Translate3d(ValueBetween(t, start_pos_.x(), end_pos_.x()),
|
| - ValueBetween(t, start_pos_.y(), end_pos_.y()),
|
| - ValueBetween(t, start_pos_.z(), end_pos_.z()));
|
| - return result;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedConstantTransform
|
| -//
|
| -
|
| -InterpolatedConstantTransform::InterpolatedConstantTransform(
|
| - const gfx::Transform& transform)
|
| - : InterpolatedTransform(),
|
| - transform_(transform) {
|
| -}
|
| -
|
| -gfx::Transform
|
| -InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const {
|
| - return transform_;
|
| -}
|
| -
|
| -InterpolatedConstantTransform::~InterpolatedConstantTransform() {}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// InterpolatedTransformAboutPivot
|
| -//
|
| -
|
| -InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
|
| - const gfx::Point& pivot,
|
| - InterpolatedTransform* transform)
|
| - : InterpolatedTransform() {
|
| - Init(pivot, transform);
|
| -}
|
| -
|
| -InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot(
|
| - const gfx::Point& pivot,
|
| - InterpolatedTransform* transform,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform() {
|
| - Init(pivot, transform);
|
| -}
|
| -
|
| -InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {}
|
| -
|
| -gfx::Transform
|
| -InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const {
|
| - if (transform_.get()) {
|
| - return transform_->Interpolate(t);
|
| - }
|
| - return gfx::Transform();
|
| -}
|
| -
|
| -void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot,
|
| - InterpolatedTransform* xform) {
|
| - gfx::Transform to_pivot;
|
| - gfx::Transform from_pivot;
|
| - to_pivot.Translate(-pivot.x(), -pivot.y());
|
| - from_pivot.Translate(pivot.x(), pivot.y());
|
| -
|
| - scoped_ptr<InterpolatedTransform> pre_transform(
|
| - new InterpolatedConstantTransform(to_pivot));
|
| - scoped_ptr<InterpolatedTransform> post_transform(
|
| - new InterpolatedConstantTransform(from_pivot));
|
| -
|
| - pre_transform->SetChild(xform);
|
| - xform->SetChild(post_transform.release());
|
| - transform_.reset(pre_transform.release());
|
| -}
|
| -
|
| -InterpolatedMatrixTransform::InterpolatedMatrixTransform(
|
| - const gfx::Transform& start_transform,
|
| - const gfx::Transform& end_transform)
|
| - : InterpolatedTransform() {
|
| - Init(start_transform, end_transform);
|
| -}
|
| -
|
| -InterpolatedMatrixTransform::InterpolatedMatrixTransform(
|
| - const gfx::Transform& start_transform,
|
| - const gfx::Transform& end_transform,
|
| - float start_time,
|
| - float end_time)
|
| - : InterpolatedTransform() {
|
| - Init(start_transform, end_transform);
|
| -}
|
| -
|
| -InterpolatedMatrixTransform::~InterpolatedMatrixTransform() {}
|
| -
|
| -gfx::Transform
|
| -InterpolatedMatrixTransform::InterpolateButDoNotCompose(float t) const {
|
| - gfx::DecomposedTransform blended;
|
| - bool success = gfx::BlendDecomposedTransforms(&blended,
|
| - end_decomp_,
|
| - start_decomp_,
|
| - t);
|
| - DCHECK(success);
|
| - return gfx::ComposeTransform(blended);
|
| -}
|
| -
|
| -void InterpolatedMatrixTransform::Init(const gfx::Transform& start_transform,
|
| - const gfx::Transform& end_transform) {
|
| - bool success = gfx::DecomposeTransform(&start_decomp_, start_transform);
|
| - DCHECK(success);
|
| - success = gfx::DecomposeTransform(&end_decomp_, end_transform);
|
| - DCHECK(success);
|
| -}
|
| -
|
| -} // namespace ui
|
|
|