| 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 #ifndef M_PI | 9 #ifndef M_PI |
| 10 #define M_PI 3.14159265358979323846 | 10 #define M_PI 3.14159265358979323846 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 { | 21 { |
| 22 float remainder = fabs(fmod(degrees, 90.0f)); | 22 float remainder = fabs(fmod(degrees, 90.0f)); |
| 23 return remainder < EPSILON || 90.0f - remainder < EPSILON; | 23 return remainder < EPSILON || 90.0f - remainder < EPSILON; |
| 24 } | 24 } |
| 25 | 25 |
| 26 // Returns false if |degrees| is not a multiple of ninety degrees or if | 26 // Returns false if |degrees| is not a multiple of ninety degrees or if |
| 27 // |rotation| is NULL. It does not affect |rotation| in this case. Otherwise | 27 // |rotation| is NULL. It does not affect |rotation| in this case. Otherwise |
| 28 // *rotation is set to be the appropriate sanitized rotation matrix. That is, | 28 // *rotation is set to be the appropriate sanitized rotation matrix. That is, |
| 29 // the rotation matrix corresponding to |degrees| which has entries that are all | 29 // the rotation matrix corresponding to |degrees| which has entries that are all |
| 30 // either 0, 1 or -1. | 30 // either 0, 1 or -1. |
| 31 bool MassageRotationIfMultipleOfNinetyDegrees(ui::Transform* rotation, | 31 bool MassageRotationIfMultipleOfNinetyDegrees(gfx::Transform* rotation, |
| 32 float degrees) | 32 float degrees) |
| 33 { | 33 { |
| 34 if (!IsMultipleOfNinetyDegrees(degrees) || !rotation) | 34 if (!IsMultipleOfNinetyDegrees(degrees) || !rotation) |
| 35 return false; | 35 return false; |
| 36 | 36 |
| 37 ui::Transform transform; | 37 gfx::Transform transform; |
| 38 SkMatrix44& m = transform.matrix(); | 38 SkMatrix44& m = transform.matrix(); |
| 39 float degrees_by_ninety = degrees / 90.0f; | 39 float degrees_by_ninety = degrees / 90.0f; |
| 40 | 40 |
| 41 int n = static_cast<int>(degrees_by_ninety > 0 | 41 int n = static_cast<int>(degrees_by_ninety > 0 |
| 42 ? floor(degrees_by_ninety + 0.5f) | 42 ? floor(degrees_by_ninety + 0.5f) |
| 43 : ceil(degrees_by_ninety - 0.5f)); | 43 : ceil(degrees_by_ninety - 0.5f)); |
| 44 | 44 |
| 45 n %= 4; | 45 n %= 4; |
| 46 if (n < 0) | 46 if (n < 0) |
| 47 n += 4; | 47 n += 4; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 InterpolatedTransform::InterpolatedTransform(float start_time, | 82 InterpolatedTransform::InterpolatedTransform(float start_time, |
| 83 float end_time) | 83 float end_time) |
| 84 : start_time_(start_time), | 84 : start_time_(start_time), |
| 85 end_time_(end_time), | 85 end_time_(end_time), |
| 86 reversed_(false) { | 86 reversed_(false) { |
| 87 } | 87 } |
| 88 | 88 |
| 89 InterpolatedTransform::~InterpolatedTransform() {} | 89 InterpolatedTransform::~InterpolatedTransform() {} |
| 90 | 90 |
| 91 ui::Transform InterpolatedTransform::Interpolate(float t) const { | 91 gfx::Transform InterpolatedTransform::Interpolate(float t) const { |
| 92 if (reversed_) | 92 if (reversed_) |
| 93 t = 1.0f - t; | 93 t = 1.0f - t; |
| 94 ui::Transform result = InterpolateButDoNotCompose(t); | 94 gfx::Transform result = InterpolateButDoNotCompose(t); |
| 95 if (child_.get()) { | 95 if (child_.get()) { |
| 96 result.ConcatTransform(child_->Interpolate(t)); | 96 result.ConcatTransform(child_->Interpolate(t)); |
| 97 } | 97 } |
| 98 return result; | 98 return result; |
| 99 } | 99 } |
| 100 | 100 |
| 101 void InterpolatedTransform::SetChild(InterpolatedTransform* child) { | 101 void InterpolatedTransform::SetChild(InterpolatedTransform* child) { |
| 102 child_.reset(child); | 102 child_.reset(child); |
| 103 } | 103 } |
| 104 | 104 |
| 105 bool InterpolatedTransform::FactorTRS(const ui::Transform& transform, | 105 bool InterpolatedTransform::FactorTRS(const gfx::Transform& transform, |
| 106 gfx::Point* translation, | 106 gfx::Point* translation, |
| 107 float* rotation, | 107 float* rotation, |
| 108 gfx::Point3f* scale) { | 108 gfx::Point3f* scale) { |
| 109 const SkMatrix44& m = transform.matrix(); | 109 const SkMatrix44& m = transform.matrix(); |
| 110 float m00 = m.get(0, 0); | 110 float m00 = m.get(0, 0); |
| 111 float m01 = m.get(0, 1); | 111 float m01 = m.get(0, 1); |
| 112 float m10 = m.get(1, 0); | 112 float m10 = m.get(1, 0); |
| 113 float m11 = m.get(1, 1); | 113 float m11 = m.get(1, 1); |
| 114 | 114 |
| 115 // A factorable 2D TRS matrix must be of the form: | 115 // A factorable 2D TRS matrix must be of the form: |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 float end_degrees, | 196 float end_degrees, |
| 197 float start_time, | 197 float start_time, |
| 198 float end_time) | 198 float end_time) |
| 199 : InterpolatedTransform(start_time, end_time), | 199 : InterpolatedTransform(start_time, end_time), |
| 200 start_degrees_(start_degrees), | 200 start_degrees_(start_degrees), |
| 201 end_degrees_(end_degrees) { | 201 end_degrees_(end_degrees) { |
| 202 } | 202 } |
| 203 | 203 |
| 204 InterpolatedRotation::~InterpolatedRotation() {} | 204 InterpolatedRotation::~InterpolatedRotation() {} |
| 205 | 205 |
| 206 ui::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const { | 206 gfx::Transform InterpolatedRotation::InterpolateButDoNotCompose(float t) const { |
| 207 ui::Transform result; | 207 gfx::Transform result; |
| 208 float interpolated_degrees = ValueBetween(t, start_degrees_, end_degrees_); | 208 float interpolated_degrees = ValueBetween(t, start_degrees_, end_degrees_); |
| 209 result.SetRotate(interpolated_degrees); | 209 result.SetRotate(interpolated_degrees); |
| 210 if (t == 0.0f || t == 1.0f) | 210 if (t == 0.0f || t == 1.0f) |
| 211 MassageRotationIfMultipleOfNinetyDegrees(&result, interpolated_degrees); | 211 MassageRotationIfMultipleOfNinetyDegrees(&result, interpolated_degrees); |
| 212 return result; | 212 return result; |
| 213 } | 213 } |
| 214 | 214 |
| 215 /////////////////////////////////////////////////////////////////////////////// | 215 /////////////////////////////////////////////////////////////////////////////// |
| 216 // InterpolatedAxisAngleRotation | 216 // InterpolatedAxisAngleRotation |
| 217 // | 217 // |
| (...skipping 15 matching lines...) Expand all Loading... |
| 233 float start_time, | 233 float start_time, |
| 234 float end_time) | 234 float end_time) |
| 235 : InterpolatedTransform(start_time, end_time), | 235 : InterpolatedTransform(start_time, end_time), |
| 236 axis_(axis), | 236 axis_(axis), |
| 237 start_degrees_(start_degrees), | 237 start_degrees_(start_degrees), |
| 238 end_degrees_(end_degrees) { | 238 end_degrees_(end_degrees) { |
| 239 } | 239 } |
| 240 | 240 |
| 241 InterpolatedAxisAngleRotation::~InterpolatedAxisAngleRotation() {} | 241 InterpolatedAxisAngleRotation::~InterpolatedAxisAngleRotation() {} |
| 242 | 242 |
| 243 ui::Transform | 243 gfx::Transform |
| 244 InterpolatedAxisAngleRotation::InterpolateButDoNotCompose(float t) const { | 244 InterpolatedAxisAngleRotation::InterpolateButDoNotCompose(float t) const { |
| 245 ui::Transform result; | 245 gfx::Transform result; |
| 246 result.SetRotateAbout(axis_, ValueBetween(t, start_degrees_, end_degrees_)); | 246 result.SetRotateAbout(axis_, ValueBetween(t, start_degrees_, end_degrees_)); |
| 247 return result; | 247 return result; |
| 248 } | 248 } |
| 249 | 249 |
| 250 /////////////////////////////////////////////////////////////////////////////// | 250 /////////////////////////////////////////////////////////////////////////////// |
| 251 // InterpolatedScale | 251 // InterpolatedScale |
| 252 // | 252 // |
| 253 | 253 |
| 254 InterpolatedScale::InterpolatedScale(float start_scale, float end_scale) | 254 InterpolatedScale::InterpolatedScale(float start_scale, float end_scale) |
| 255 : InterpolatedTransform(), | 255 : InterpolatedTransform(), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 275 const gfx::Point3f& end_scale, | 275 const gfx::Point3f& end_scale, |
| 276 float start_time, | 276 float start_time, |
| 277 float end_time) | 277 float end_time) |
| 278 : InterpolatedTransform(start_time, end_time), | 278 : InterpolatedTransform(start_time, end_time), |
| 279 start_scale_(start_scale), | 279 start_scale_(start_scale), |
| 280 end_scale_(end_scale) { | 280 end_scale_(end_scale) { |
| 281 } | 281 } |
| 282 | 282 |
| 283 InterpolatedScale::~InterpolatedScale() {} | 283 InterpolatedScale::~InterpolatedScale() {} |
| 284 | 284 |
| 285 ui::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const { | 285 gfx::Transform InterpolatedScale::InterpolateButDoNotCompose(float t) const { |
| 286 ui::Transform result; | 286 gfx::Transform result; |
| 287 float scale_x = ValueBetween(t, start_scale_.x(), end_scale_.x()); | 287 float scale_x = ValueBetween(t, start_scale_.x(), end_scale_.x()); |
| 288 float scale_y = ValueBetween(t, start_scale_.y(), end_scale_.y()); | 288 float scale_y = ValueBetween(t, start_scale_.y(), end_scale_.y()); |
| 289 // TODO(vollick) 3d xforms. | 289 // TODO(vollick) 3d xforms. |
| 290 result.SetScale(scale_x, scale_y); | 290 result.SetScale(scale_x, scale_y); |
| 291 return result; | 291 return result; |
| 292 } | 292 } |
| 293 | 293 |
| 294 /////////////////////////////////////////////////////////////////////////////// | 294 /////////////////////////////////////////////////////////////////////////////// |
| 295 // InterpolatedTranslation | 295 // InterpolatedTranslation |
| 296 // | 296 // |
| 297 | 297 |
| 298 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, | 298 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, |
| 299 const gfx::Point& end_pos) | 299 const gfx::Point& end_pos) |
| 300 : InterpolatedTransform(), | 300 : InterpolatedTransform(), |
| 301 start_pos_(start_pos), | 301 start_pos_(start_pos), |
| 302 end_pos_(end_pos) { | 302 end_pos_(end_pos) { |
| 303 } | 303 } |
| 304 | 304 |
| 305 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, | 305 InterpolatedTranslation::InterpolatedTranslation(const gfx::Point& start_pos, |
| 306 const gfx::Point& end_pos, | 306 const gfx::Point& end_pos, |
| 307 float start_time, | 307 float start_time, |
| 308 float end_time) | 308 float end_time) |
| 309 : InterpolatedTransform(start_time, end_time), | 309 : InterpolatedTransform(start_time, end_time), |
| 310 start_pos_(start_pos), | 310 start_pos_(start_pos), |
| 311 end_pos_(end_pos) { | 311 end_pos_(end_pos) { |
| 312 } | 312 } |
| 313 | 313 |
| 314 InterpolatedTranslation::~InterpolatedTranslation() {} | 314 InterpolatedTranslation::~InterpolatedTranslation() {} |
| 315 | 315 |
| 316 ui::Transform | 316 gfx::Transform |
| 317 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const { | 317 InterpolatedTranslation::InterpolateButDoNotCompose(float t) const { |
| 318 ui::Transform result; | 318 gfx::Transform result; |
| 319 // TODO(vollick) 3d xforms. | 319 // TODO(vollick) 3d xforms. |
| 320 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()), | 320 result.SetTranslate(ValueBetween(t, start_pos_.x(), end_pos_.x()), |
| 321 ValueBetween(t, start_pos_.y(), end_pos_.y())); | 321 ValueBetween(t, start_pos_.y(), end_pos_.y())); |
| 322 return result; | 322 return result; |
| 323 } | 323 } |
| 324 | 324 |
| 325 /////////////////////////////////////////////////////////////////////////////// | 325 /////////////////////////////////////////////////////////////////////////////// |
| 326 // InterpolatedConstantTransform | 326 // InterpolatedConstantTransform |
| 327 // | 327 // |
| 328 | 328 |
| 329 InterpolatedConstantTransform::InterpolatedConstantTransform( | 329 InterpolatedConstantTransform::InterpolatedConstantTransform( |
| 330 const ui::Transform& transform) | 330 const gfx::Transform& transform) |
| 331 : InterpolatedTransform(), | 331 : InterpolatedTransform(), |
| 332 transform_(transform) { | 332 transform_(transform) { |
| 333 } | 333 } |
| 334 | 334 |
| 335 ui::Transform | 335 gfx::Transform |
| 336 InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const { | 336 InterpolatedConstantTransform::InterpolateButDoNotCompose(float t) const { |
| 337 return transform_; | 337 return transform_; |
| 338 } | 338 } |
| 339 | 339 |
| 340 InterpolatedConstantTransform::~InterpolatedConstantTransform() {} | 340 InterpolatedConstantTransform::~InterpolatedConstantTransform() {} |
| 341 | 341 |
| 342 /////////////////////////////////////////////////////////////////////////////// | 342 /////////////////////////////////////////////////////////////////////////////// |
| 343 // InterpolatedTransformAboutPivot | 343 // InterpolatedTransformAboutPivot |
| 344 // | 344 // |
| 345 | 345 |
| 346 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | 346 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( |
| 347 const gfx::Point& pivot, | 347 const gfx::Point& pivot, |
| 348 InterpolatedTransform* transform) | 348 InterpolatedTransform* transform) |
| 349 : InterpolatedTransform() { | 349 : InterpolatedTransform() { |
| 350 Init(pivot, transform); | 350 Init(pivot, transform); |
| 351 } | 351 } |
| 352 | 352 |
| 353 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( | 353 InterpolatedTransformAboutPivot::InterpolatedTransformAboutPivot( |
| 354 const gfx::Point& pivot, | 354 const gfx::Point& pivot, |
| 355 InterpolatedTransform* transform, | 355 InterpolatedTransform* transform, |
| 356 float start_time, | 356 float start_time, |
| 357 float end_time) | 357 float end_time) |
| 358 : InterpolatedTransform() { | 358 : InterpolatedTransform() { |
| 359 Init(pivot, transform); | 359 Init(pivot, transform); |
| 360 } | 360 } |
| 361 | 361 |
| 362 InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {} | 362 InterpolatedTransformAboutPivot::~InterpolatedTransformAboutPivot() {} |
| 363 | 363 |
| 364 ui::Transform | 364 gfx::Transform |
| 365 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const { | 365 InterpolatedTransformAboutPivot::InterpolateButDoNotCompose(float t) const { |
| 366 if (transform_.get()) { | 366 if (transform_.get()) { |
| 367 return transform_->Interpolate(t); | 367 return transform_->Interpolate(t); |
| 368 } | 368 } |
| 369 return Transform(); | 369 return gfx::Transform(); |
| 370 } | 370 } |
| 371 | 371 |
| 372 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot, | 372 void InterpolatedTransformAboutPivot::Init(const gfx::Point& pivot, |
| 373 InterpolatedTransform* xform) { | 373 InterpolatedTransform* xform) { |
| 374 ui::Transform to_pivot; | 374 gfx::Transform to_pivot; |
| 375 ui::Transform from_pivot; | 375 gfx::Transform from_pivot; |
| 376 to_pivot.SetTranslate(-pivot.x(), -pivot.y()); | 376 to_pivot.SetTranslate(-pivot.x(), -pivot.y()); |
| 377 from_pivot.SetTranslate(pivot.x(), pivot.y()); | 377 from_pivot.SetTranslate(pivot.x(), pivot.y()); |
| 378 | 378 |
| 379 scoped_ptr<InterpolatedTransform> pre_transform( | 379 scoped_ptr<InterpolatedTransform> pre_transform( |
| 380 new InterpolatedConstantTransform(to_pivot)); | 380 new InterpolatedConstantTransform(to_pivot)); |
| 381 scoped_ptr<InterpolatedTransform> post_transform( | 381 scoped_ptr<InterpolatedTransform> post_transform( |
| 382 new InterpolatedConstantTransform(from_pivot)); | 382 new InterpolatedConstantTransform(from_pivot)); |
| 383 | 383 |
| 384 pre_transform->SetChild(xform); | 384 pre_transform->SetChild(xform); |
| 385 xform->SetChild(post_transform.release()); | 385 xform->SetChild(post_transform.release()); |
| 386 transform_.reset(pre_transform.release()); | 386 transform_.reset(pre_transform.release()); |
| 387 } | 387 } |
| 388 | 388 |
| 389 InterpolatedTRSTransform::InterpolatedTRSTransform( | 389 InterpolatedTRSTransform::InterpolatedTRSTransform( |
| 390 const ui::Transform& start_transform, | 390 const gfx::Transform& start_transform, |
| 391 const ui::Transform& end_transform) | 391 const gfx::Transform& end_transform) |
| 392 : InterpolatedTransform() { | 392 : InterpolatedTransform() { |
| 393 Init(start_transform, end_transform); | 393 Init(start_transform, end_transform); |
| 394 } | 394 } |
| 395 | 395 |
| 396 InterpolatedTRSTransform::InterpolatedTRSTransform( | 396 InterpolatedTRSTransform::InterpolatedTRSTransform( |
| 397 const ui::Transform& start_transform, | 397 const gfx::Transform& start_transform, |
| 398 const ui::Transform& end_transform, | 398 const gfx::Transform& end_transform, |
| 399 float start_time, | 399 float start_time, |
| 400 float end_time) | 400 float end_time) |
| 401 : InterpolatedTransform() { | 401 : InterpolatedTransform() { |
| 402 Init(start_transform, end_transform); | 402 Init(start_transform, end_transform); |
| 403 } | 403 } |
| 404 | 404 |
| 405 InterpolatedTRSTransform::~InterpolatedTRSTransform() {} | 405 InterpolatedTRSTransform::~InterpolatedTRSTransform() {} |
| 406 | 406 |
| 407 ui::Transform | 407 gfx::Transform |
| 408 InterpolatedTRSTransform::InterpolateButDoNotCompose(float t) const { | 408 InterpolatedTRSTransform::InterpolateButDoNotCompose(float t) const { |
| 409 if (transform_.get()) { | 409 if (transform_.get()) { |
| 410 return transform_->Interpolate(t); | 410 return transform_->Interpolate(t); |
| 411 } | 411 } |
| 412 return Transform(); | 412 return gfx::Transform(); |
| 413 } | 413 } |
| 414 | 414 |
| 415 void InterpolatedTRSTransform::Init(const Transform& start_transform, | 415 void InterpolatedTRSTransform::Init(const gfx::Transform& start_transform, |
| 416 const Transform& end_transform) { | 416 const gfx::Transform& end_transform) { |
| 417 gfx::Point start_translation, end_translation; | 417 gfx::Point start_translation, end_translation; |
| 418 gfx::Point3f start_scale, end_scale; | 418 gfx::Point3f start_scale, end_scale; |
| 419 float start_degrees, end_degrees; | 419 float start_degrees, end_degrees; |
| 420 if (FactorTRS(start_transform, | 420 if (FactorTRS(start_transform, |
| 421 &start_translation, | 421 &start_translation, |
| 422 &start_degrees, | 422 &start_degrees, |
| 423 &start_scale) && | 423 &start_scale) && |
| 424 FactorTRS(end_transform, | 424 FactorTRS(end_transform, |
| 425 &end_translation, | 425 &end_translation, |
| 426 &end_degrees, | 426 &end_degrees, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 439 | 439 |
| 440 rotation->SetChild(translation.release()); | 440 rotation->SetChild(translation.release()); |
| 441 scale->SetChild(rotation.release()); | 441 scale->SetChild(rotation.release()); |
| 442 transform_.reset(scale.release()); | 442 transform_.reset(scale.release()); |
| 443 } else { | 443 } else { |
| 444 transform_.reset(new InterpolatedConstantTransform(end_transform)); | 444 transform_.reset(new InterpolatedConstantTransform(end_transform)); |
| 445 } | 445 } |
| 446 } | 446 } |
| 447 | 447 |
| 448 } // namespace ui | 448 } // namespace ui |
| OLD | NEW |