| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/gfx/interpolated_transform.h" | 5 #include "ui/gfx/interpolated_transform.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" |
| 10 |
| 9 #ifndef M_PI | 11 #ifndef M_PI |
| 10 #define M_PI 3.14159265358979323846 | 12 #define M_PI 3.14159265358979323846 |
| 11 #endif | 13 #endif |
| 12 | 14 |
| 13 #include "base/logging.h" | 15 #include "base/logging.h" |
| 14 #include "ui/gfx/animation/tween.h" | 16 #include "ui/gfx/animation/tween.h" |
| 15 | 17 |
| 16 namespace { | 18 namespace { |
| 17 | 19 |
| 18 static const double EPSILON = 1e-6; | 20 static const double EPSILON = 1e-6; |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 gfx::Transform InterpolatedTransform::Interpolate(float t) const { | 91 gfx::Transform InterpolatedTransform::Interpolate(float t) const { |
| 90 if (reversed_) | 92 if (reversed_) |
| 91 t = 1.0f - t; | 93 t = 1.0f - t; |
| 92 gfx::Transform result = InterpolateButDoNotCompose(t); | 94 gfx::Transform result = InterpolateButDoNotCompose(t); |
| 93 if (child_.get()) { | 95 if (child_.get()) { |
| 94 result.ConcatTransform(child_->Interpolate(t)); | 96 result.ConcatTransform(child_->Interpolate(t)); |
| 95 } | 97 } |
| 96 return result; | 98 return result; |
| 97 } | 99 } |
| 98 | 100 |
| 99 void InterpolatedTransform::SetChild(InterpolatedTransform* child) { | 101 void InterpolatedTransform::SetChild( |
| 100 child_.reset(child); | 102 std::unique_ptr<InterpolatedTransform> child) { |
| 103 child_ = std::move(child); |
| 101 } | 104 } |
| 102 | 105 |
| 103 inline float InterpolatedTransform::ValueBetween(float time, | 106 inline float InterpolatedTransform::ValueBetween(float time, |
| 104 float start_value, | 107 float start_value, |
| 105 float end_value) const { | 108 float end_value) const { |
| 106 // can't handle NaN | 109 // can't handle NaN |
| 107 DCHECK(time == time && start_time_ == start_time_ && end_time_ == end_time_); | 110 DCHECK(time == time && start_time_ == start_time_ && end_time_ == end_time_); |
| 108 if (time != time || start_time_ != start_time_ || end_time_ != end_time_) | 111 if (time != time || start_time_ != start_time_ || end_time_ != end_time_) |
| 109 return start_value; | 112 return start_value; |
| 110 | 113 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 return transform_; | 294 return transform_; |
| 292 } | 295 } |
| 293 | 296 |
| 294 InterpolatedConstantTransform::~InterpolatedConstantTransform() {} | 297 InterpolatedConstantTransform::~InterpolatedConstantTransform() {} |
| 295 | 298 |
| 296 /////////////////////////////////////////////////////////////////////////////// | 299 /////////////////////////////////////////////////////////////////////////////// |
| 297 // InterpolatedTransformAboutPivot | 300 // InterpolatedTransformAboutPivot |
| 298 // | 301 // |
| 299 | 302 |
| 300 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | 303 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( |
| 301 const gfx::Point& pivot, | 304 const gfx::Point& pivot, |
| 302 InterpolatedTransform* transform) | 305 std::unique_ptr<InterpolatedTransform> transform) |
| 303 : InterpolatedTransform() { | 306 : InterpolatedTransform() { |
| 304 Init(pivot, transform); | 307 Init(pivot, std::move(transform)); |
| 305 } | 308 } |
| 306 | 309 |
| 307 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | 310 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( |
| 308 const gfx::Point& pivot, | 311 const gfx::Point& pivot, |
| 309 InterpolatedTransform* transform, | 312 std::unique_ptr<InterpolatedTransform> transform, |
| 310 float start_time, | 313 float start_time, |
| 311 float end_time) | 314 float end_time) |
| 312 : InterpolatedTransform() { | 315 : InterpolatedTransform() { |
| 313 Init(pivot, transform); | 316 Init(pivot, std::move(transform)); |
| 314 } | 317 } |
| 315 | 318 |
| 316 InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {} | 319 InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {} |
| 317 | 320 |
| 318 gfx::Transform | 321 gfx::Transform |
| 319 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const { | 322 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const { |
| 320 if (transform_.get()) { | 323 if (transform_.get()) { |
| 321 return transform_->Interpolate(t); | 324 return transform_->Interpolate(t); |
| 322 } | 325 } |
| 323 return gfx::Transform(); | 326 return gfx::Transform(); |
| 324 } | 327 } |
| 325 | 328 |
| 326 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot, | 329 void InterpolatedTransformAboutPivot::Init( |
| 327 InterpolatedTransform* xform) { | 330 const gfx::Point& pivot, |
| 331 std::unique_ptr<InterpolatedTransform> xform) { |
| 328 gfx::Transform to_pivot; | 332 gfx::Transform to_pivot; |
| 329 gfx::Transform from_pivot; | 333 gfx::Transform from_pivot; |
| 330 to_pivot.Translate(SkIntToMScalar(-pivot.x()), SkIntToMScalar(-pivot.y())); | 334 to_pivot.Translate(SkIntToMScalar(-pivot.x()), SkIntToMScalar(-pivot.y())); |
| 331 from_pivot.Translate(SkIntToMScalar(pivot.x()), SkIntToMScalar(pivot.y())); | 335 from_pivot.Translate(SkIntToMScalar(pivot.x()), SkIntToMScalar(pivot.y())); |
| 332 | 336 |
| 333 std::unique_ptr<InterpolatedTransform> pre_transform( | 337 std::unique_ptr<InterpolatedTransform> pre_transform = |
| 334 new InterpolatedConstantTransform(to_pivot)); | 338 base::MakeUnique<InterpolatedConstantTransform>(to_pivot); |
| 335 std::unique_ptr<InterpolatedTransform> post_transform( | 339 std::unique_ptr<InterpolatedTransform> post_transform = |
| 336 new InterpolatedConstantTransform(from_pivot)); | 340 base::MakeUnique<InterpolatedConstantTransform>(from_pivot); |
| 337 | 341 |
| 338 pre_transform->SetChild(xform); | 342 xform->SetChild(std::move(post_transform)); |
| 339 xform->SetChild(post_transform.release()); | 343 pre_transform->SetChild(std::move(xform)); |
| 340 transform_ = std::move(pre_transform); | 344 transform_ = std::move(pre_transform); |
| 341 } | 345 } |
| 342 | 346 |
| 343 InterpolatedMatrixTransform::InterpolatedMatrixTransform( | 347 InterpolatedMatrixTransform::InterpolatedMatrixTransform( |
| 344 const gfx::Transform& start_transform, | 348 const gfx::Transform& start_transform, |
| 345 const gfx::Transform& end_transform) | 349 const gfx::Transform& end_transform) |
| 346 : InterpolatedTransform() { | 350 : InterpolatedTransform() { |
| 347 Init(start_transform, end_transform); | 351 Init(start_transform, end_transform); |
| 348 } | 352 } |
| 349 | 353 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 371 | 375 |
| 372 void InterpolatedMatrixTransform::Init(const gfx::Transform& start_transform, | 376 void InterpolatedMatrixTransform::Init(const gfx::Transform& start_transform, |
| 373 const gfx::Transform& end_transform) { | 377 const gfx::Transform& end_transform) { |
| 374 bool success = gfx::DecomposeTransform(&start_decomp_, start_transform); | 378 bool success = gfx::DecomposeTransform(&start_decomp_, start_transform); |
| 375 DCHECK(success); | 379 DCHECK(success); |
| 376 success = gfx::DecomposeTransform(&end_decomp_, end_transform); | 380 success = gfx::DecomposeTransform(&end_decomp_, end_transform); |
| 377 DCHECK(success); | 381 DCHECK(success); |
| 378 } | 382 } |
| 379 | 383 |
| 380 } // namespace ui | 384 } // namespace ui |
| OLD | NEW |