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 |