Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "cc/math_util.h" | 5 #include "cc/math_util.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <limits> | 8 #include <limits> |
| 9 | 9 |
| 10 #include "ui/gfx/quad_f.h" | 10 #include "ui/gfx/quad_f.h" |
| (...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 dotProduct = std::max(-1.0, std::min(1.0, dotProduct)); | 388 dotProduct = std::max(-1.0, std::min(1.0, dotProduct)); |
| 389 return static_cast<float>(Rad2Deg(std::acos(dotProduct))); | 389 return static_cast<float>(Rad2Deg(std::acos(dotProduct))); |
| 390 } | 390 } |
| 391 | 391 |
| 392 gfx::Vector2dF MathUtil::projectVector(gfx::Vector2dF source, gfx::Vector2dF des tination) | 392 gfx::Vector2dF MathUtil::projectVector(gfx::Vector2dF source, gfx::Vector2dF des tination) |
| 393 { | 393 { |
| 394 float projectedLength = gfx::DotProduct(source, destination) / destination.L engthSquared(); | 394 float projectedLength = gfx::DotProduct(source, destination) / destination.L engthSquared(); |
| 395 return gfx::Vector2dF(projectedLength * destination.x(), projectedLength * d estination.y()); | 395 return gfx::Vector2dF(projectedLength * destination.x(), projectedLength * d estination.y()); |
| 396 } | 396 } |
| 397 | 397 |
| 398 bool MathUtil::isInvertible(const gfx::Transform& transform) | |
| 399 { | |
| 400 // TODO (shawnsingh): improve this function. We don't need to perform a | |
| 401 // full matrix inversion when the matrix was actually invertible. | |
|
Ian Vollick
2012/11/16 13:44:46
Now that SkMatrix44::determinant is public, would
| |
| 402 gfx::Transform inverse; | |
| 403 bool invertible = transform.GetInverse(&inverse); | |
| 404 return invertible; | |
| 405 } | |
| 406 | |
| 407 bool MathUtil::isBackFaceVisible(const gfx::Transform&) | |
| 408 { | |
| 409 DCHECK(false); // NOT YET IMPLEMENTED!! | |
| 410 return false; | |
| 411 } | |
| 412 | |
| 413 bool MathUtil::isIdentity(const gfx::Transform& transform) | |
| 414 { | |
| 415 return transform.matrix().isIdentity(); | |
| 416 } | |
| 417 | |
| 418 bool MathUtil::isIdentityOrTranslation(const gfx::Transform& transform) | |
| 419 { | |
| 420 const SkMatrix44& matrix = transform.matrix(); | |
| 421 | |
|
Ian Vollick
2012/11/16 13:44:46
SkMatrix44 now has getDouble for accessing matrix
| |
| 422 bool hasNoPerspective = !matrix.get(3, 0) && !matrix.get(3, 1) && !matrix.ge t(3, 2) && (matrix.get(3, 3) == 1); | |
| 423 bool hasNoRotationOrSkew = !matrix.get(0, 1) && !matrix.get(0, 2) && !matrix .get(1, 0) && | |
| 424 !matrix.get(1, 2) && !matrix.get(2, 0) && !matrix.get(2, 1); | |
| 425 bool hasNoScale = matrix.get(0, 0) == 1 | |
| 426 && matrix.get(1, 1) == 1 | |
| 427 && matrix.get(2, 2) == 1; | |
| 428 | |
| 429 return hasNoPerspective && hasNoRotationOrSkew && hasNoScale; | |
| 430 } | |
| 431 | |
| 432 bool MathUtil::hasPerspective(const gfx::Transform& transform) | |
| 433 { | |
| 434 // Mathematically it is a bit too strict to expect the 4th element to be | |
| 435 // equal to 1. However, the only non-perspective case where this element | |
| 436 // becomes non-1 is when it was explicitly initialized. In that case it | |
| 437 // still causes us to have a nontrivial divide-by-w, so we count it as | |
| 438 // being perspective here. | |
| 439 const SkMatrix44& matrix = transform.matrix(); | |
| 440 return matrix.get(3, 0) || matrix.get(3, 1) || matrix.get(3, 2) || (matrix.g et(3, 3) != 1); | |
| 441 } | |
| 442 | |
| 443 void MathUtil::makeIdentity(gfx::Transform* transform) | |
| 444 { | |
| 445 transform->matrix().setIdentity(); | |
| 446 } | |
| 447 | |
| 448 void MathUtil::rotateEulerAngles(gfx::Transform* transform, float eulerX, float eulerY, float eulerZ) | |
| 449 { | |
| 450 // TODO (shawnsingh): make this implementation faster and more accurate by | |
| 451 // hard-coding each matrix instead of calling rotateAxisAngle(). | |
|
Ian Vollick
2012/11/16 13:44:46
Actually, it would be nice if SkMatrix44 noticed w
shawnsingh
2012/11/17 00:38:31
I think I understand you're saying that we should
| |
| 452 gfx::Transform rotationAboutX; | |
| 453 gfx::Transform rotationAboutY; | |
| 454 gfx::Transform rotationAboutZ; | |
| 455 | |
| 456 MathUtil::rotateAxisAngle(&rotationAboutX, 1, 0, 0, eulerX); | |
| 457 MathUtil::rotateAxisAngle(&rotationAboutY, 0, 1, 0, eulerY); | |
| 458 MathUtil::rotateAxisAngle(&rotationAboutZ, 0, 0, 1, eulerZ); | |
| 459 | |
| 460 gfx::Transform composite = rotationAboutZ * rotationAboutY * rotationAboutX; | |
| 461 transform->PreconcatTransform(composite); | |
| 462 } | |
| 463 | |
| 464 void MathUtil::rotateAxisAngle(gfx::Transform* transform, float i, float j, floa t k, float degrees) | |
| 465 { | |
| 466 // TODO (shawnsingh): fix gfx::Transform API to receive vector instead of | |
| 467 // point for the axis. | |
|
Ian Vollick
2012/11/16 13:44:46
This is a good point, but this would ideally be a
shawnsingh
2012/11/17 00:38:31
Sounds like musings for follow-up patch, right? a
| |
| 468 gfx::Point3F axis(i, j, k); | |
| 469 transform->PreconcatRotateAbout(axis, degrees); | |
| 470 } | |
| 471 | |
| 472 gfx::Transform MathUtil::inverse(const gfx::Transform& transform) | |
| 473 { | |
| 474 gfx::Transform result; | |
| 475 transform.GetInverse(&result); | |
|
Ian Vollick
2012/11/16 13:44:46
GetInverse should be decorated with WARN_UNUSED_RE
| |
| 476 return result; | |
| 477 } | |
| 478 | |
| 479 gfx::Transform MathUtil::to2dTransform(const gfx::Transform& transform) | |
| 480 { | |
| 481 gfx::Transform result = transform; | |
| 482 SkMatrix44& matrix = result.matrix(); | |
| 483 matrix.set(0, 2, 0); | |
|
Ian Vollick
2012/11/16 13:44:46
setDouble
| |
| 484 matrix.set(1, 2, 0); | |
| 485 matrix.set(2, 2, 1); | |
| 486 matrix.set(3, 2, 0); | |
| 487 | |
| 488 matrix.set(2, 0, 0); | |
| 489 matrix.set(2, 1, 0); | |
| 490 matrix.set(2, 3, 0); | |
| 491 | |
| 492 return result; | |
| 493 } | |
| 494 | |
| 495 gfx::Transform MathUtil::toGfxTransform(const WebKit::WebTransformationMatrix&) | |
| 496 { | |
| 497 DCHECK(false); // NOT YET IMPLEMENTED!! | |
| 498 return gfx::Transform(); | |
| 499 } | |
| 500 | |
| 501 gfx::Transform MathUtil::createGfxTransform(float m11, float m12, float m13, flo at m14, | |
| 502 float m21, float m22, float m23, flo at m24, | |
| 503 float m31, float m32, float m33, flo at m34, | |
| 504 float m41, float m42, float m43, flo at m44) | |
| 505 { | |
| 506 gfx::Transform result; | |
| 507 SkMatrix44& matrix = result.matrix(); | |
| 508 | |
| 509 // Initialize column 1 | |
| 510 matrix.set(0, 0, m11); | |
|
Ian Vollick
2012/11/16 13:44:46
setDouble.
| |
| 511 matrix.set(1, 0, m12); | |
| 512 matrix.set(2, 0, m13); | |
| 513 matrix.set(3, 0, m14); | |
| 514 | |
| 515 // Initialize column 2 | |
| 516 matrix.set(0, 1, m21); | |
| 517 matrix.set(1, 1, m22); | |
| 518 matrix.set(2, 1, m23); | |
| 519 matrix.set(3, 1, m24); | |
| 520 | |
| 521 // Initialize column 2 | |
|
Ian Vollick
2012/11/16 13:44:46
Copy pasta -- column 3. Here and below.
| |
| 522 matrix.set(0, 2, m31); | |
| 523 matrix.set(1, 2, m32); | |
| 524 matrix.set(2, 2, m33); | |
| 525 matrix.set(3, 2, m34); | |
| 526 | |
| 527 // Initialize column 2 | |
| 528 matrix.set(0, 3, m41); | |
| 529 matrix.set(1, 3, m42); | |
| 530 matrix.set(2, 3, m43); | |
| 531 matrix.set(3, 3, m44); | |
| 532 | |
| 533 return result; | |
| 534 } | |
| 535 | |
| 536 gfx::Transform MathUtil::createGfxTransform(float a, float b, float c, | |
| 537 float d, float e, float f) | |
| 538 { | |
| 539 gfx::Transform result; | |
| 540 SkMatrix44& matrix = result.matrix(); | |
| 541 matrix.set(0, 0, a); | |
|
Ian Vollick
2012/11/16 13:44:46
setDouble
| |
| 542 matrix.set(1, 0, b); | |
| 543 matrix.set(0, 1, c); | |
| 544 matrix.set(1, 1, d); | |
| 545 matrix.set(0, 3, e); | |
| 546 matrix.set(1, 3, f); | |
| 547 | |
| 548 return result; | |
| 549 } | |
| 550 | |
| 551 gfx::Transform operator*(const gfx::Transform& A, const gfx::Transform& B) | |
| 552 { | |
| 553 // Compute A * B. | |
| 554 gfx::Transform result = A; | |
| 555 result.PreconcatTransform(B); | |
| 556 return result; | |
| 557 } | |
| 558 | |
| 398 } // namespace cc | 559 } // namespace cc |
| OLD | NEW |