blob: 6110c8db2c7f70e87a4b547d25f4e1d4a9d99509 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/compositor/transform_animation_curve_adapter.h"
#include "base/memory/ptr_util.h"
#include "ui/gfx/geometry/decomposed_transform.h"
#include "ui/gfx/geometry/transform_util.h"
namespace ui {
namespace {
static gfx::TransformOperations WrapTransform(const gfx::Transform& transform) {
gfx::TransformOperations operations;
operations.AppendMatrix(transform);
return operations;
}
} // namespace
TransformAnimationCurveAdapter::TransformAnimationCurveAdapter(
gfx::Tween::Type tween_type,
gfx::Transform initial_value,
gfx::Transform target_value,
base::TimeDelta duration)
: tween_type_(tween_type),
initial_value_(initial_value),
initial_wrapped_value_(WrapTransform(initial_value)),
target_value_(target_value),
target_wrapped_value_(WrapTransform(target_value)),
decomposed_initial_value_(
initial_value.Decompose().value_or(gfx::DecomposedTransform())),
decomposed_target_value_(
target_value.Decompose().value_or(gfx::DecomposedTransform())),
duration_(duration) {}
TransformAnimationCurveAdapter::TransformAnimationCurveAdapter(
const TransformAnimationCurveAdapter& other) = default;
TransformAnimationCurveAdapter::~TransformAnimationCurveAdapter() {
}
base::TimeDelta TransformAnimationCurveAdapter::Duration() const {
return duration_;
}
std::unique_ptr<gfx::AnimationCurve> TransformAnimationCurveAdapter::Clone()
const {
return base::WrapUnique(new TransformAnimationCurveAdapter(
tween_type_, initial_value_, target_value_, duration_));
}
gfx::TransformOperations TransformAnimationCurveAdapter::GetValue(
base::TimeDelta t) const {
if (t >= duration_)
return target_wrapped_value_;
if (t <= base::TimeDelta())
return initial_wrapped_value_;
gfx::DecomposedTransform to_return = gfx::BlendDecomposedTransforms(
decomposed_target_value_, decomposed_initial_value_,
gfx::Tween::CalculateValue(tween_type_, t / duration_));
return WrapTransform(gfx::Transform::Compose(to_return));
}
gfx::TransformOperations TransformAnimationCurveAdapter::GetTransformedValue(
base::TimeDelta t,
gfx::TimingFunction::LimitDirection) const {
return GetValue(t);
}
bool TransformAnimationCurveAdapter::PreservesAxisAlignment() const {
return (initial_value_.IsIdentity() ||
initial_value_.IsScaleOrTranslation()) &&
(target_value_.IsIdentity() || target_value_.IsScaleOrTranslation());
}
bool TransformAnimationCurveAdapter::MaximumScale(float* max_scale) const {
constexpr float kInvalidScale = 0.f;
gfx::Vector2dF initial_scales =
gfx::ComputeTransform2dScaleComponents(initial_value_, kInvalidScale);
gfx::Vector2dF target_scales =
gfx::ComputeTransform2dScaleComponents(target_value_, kInvalidScale);
*max_scale = std::max({initial_scales.x(), initial_scales.y(),
target_scales.x(), target_scales.y()});
return *max_scale != kInvalidScale;
}
} // namespace ui