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 const SkMatrix44& matrix = transform.matrix(); | |
| 401 double determinant = matrix.determinant(); | |
| 402 | |
| 403 // TODO (shawnsingh): we may need to check fuzzy against an epsilon here ins tead? | |
|
danakj
2012/11/17 02:14:17
Is something random going to break and cause a rev
| |
| 404 return determinant != 0; | |
| 405 } | |
| 406 | |
| 407 bool MathUtil::isBackFaceVisible(const gfx::Transform&) | |
| 408 { | |
| 409 DCHECK(false); // NOT YET IMPLEMENTED!! | |
|
danakj
2012/11/17 02:14:17
NOTREACHED()
| |
| 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 | |
| 422 bool hasNoPerspective = !matrix.getDouble(3, 0) && !matrix.getDouble(3, 1) & & !matrix.getDouble(3, 2) && (matrix.getDouble(3, 3) == 1); | |
| 423 bool hasNoRotationOrSkew = !matrix.getDouble(0, 1) && !matrix.getDouble(0, 2 ) && !matrix.getDouble(1, 0) && | |
| 424 !matrix.getDouble(1, 2) && !matrix.getDouble(2, 0) && !matrix.getDouble( 2, 1); | |
| 425 bool hasNoScale = matrix.getDouble(0, 0) == 1 | |
|
danakj
2012/11/17 02:14:17
nit: the line wrapping is inconsistent here.
| |
| 426 && matrix.getDouble(1, 1) == 1 | |
| 427 && matrix.getDouble(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.getDouble(3, 0) || matrix.getDouble(3, 1) || matrix.getDouble( 3, 2) || (matrix.getDouble(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, double eulerX, doubl e eulerY, double eulerZ) | |
| 449 { | |
| 450 // TODO (shawnsingh): make this implementation faster and more accurate by | |
| 451 // hard-coding each matrix instead of calling rotateAxisAngle(). | |
| 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, double i, double j, do uble k, double degrees) | |
| 465 { | |
| 466 // TODO (shawnsingh): fix gfx::Transform API to receive vector instead of | |
| 467 // point for the axis. | |
| 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 bool invertedSuccessfully = transform.GetInverse(&result); | |
| 476 | |
| 477 if (invertedSuccessfully) | |
| 478 return result; | |
| 479 | |
| 480 // If transform was un-invertible, then just return identity. | |
| 481 return gfx::Transform(); | |
| 482 } | |
| 483 | |
| 484 gfx::Transform MathUtil::to2dTransform(const gfx::Transform& transform) | |
| 485 { | |
| 486 gfx::Transform result = transform; | |
| 487 SkMatrix44& matrix = result.matrix(); | |
| 488 matrix.setDouble(0, 2, 0); | |
| 489 matrix.setDouble(1, 2, 0); | |
| 490 matrix.setDouble(2, 2, 1); | |
| 491 matrix.setDouble(3, 2, 0); | |
| 492 | |
| 493 matrix.setDouble(2, 0, 0); | |
| 494 matrix.setDouble(2, 1, 0); | |
| 495 matrix.setDouble(2, 3, 0); | |
| 496 | |
| 497 return result; | |
| 498 } | |
| 499 | |
| 500 gfx::Transform MathUtil::toGfxTransform(const WebKit::WebTransformationMatrix&) | |
| 501 { | |
| 502 DCHECK(false); // NOT YET IMPLEMENTED!! | |
|
danakj
2012/11/17 02:14:17
NOTREACHED() but..
We're going to need this to ev
shawnsingh
2012/11/17 05:42:41
OK I guess you've landed by now, but why is it imp
danakj
2012/11/17 08:27:21
It's in and waiting for roll.
Also, it's explicit
| |
| 503 return gfx::Transform(); | |
| 504 } | |
| 505 | |
| 506 gfx::Transform MathUtil::createGfxTransform(double m11, double m12, double m13, double m14, | |
| 507 double m21, double m22, double m23, double m24, | |
| 508 double m31, double m32, double m33, double m34, | |
| 509 double m41, double m42, double m43, double m44) | |
| 510 { | |
| 511 gfx::Transform result; | |
| 512 SkMatrix44& matrix = result.matrix(); | |
| 513 | |
| 514 // Initialize column 1 | |
| 515 matrix.setDouble(0, 0, m11); | |
| 516 matrix.setDouble(1, 0, m12); | |
| 517 matrix.setDouble(2, 0, m13); | |
| 518 matrix.setDouble(3, 0, m14); | |
| 519 | |
| 520 // Initialize column 2 | |
| 521 matrix.setDouble(0, 1, m21); | |
| 522 matrix.setDouble(1, 1, m22); | |
| 523 matrix.setDouble(2, 1, m23); | |
| 524 matrix.setDouble(3, 1, m24); | |
| 525 | |
| 526 // Initialize column 3 | |
| 527 matrix.setDouble(0, 2, m31); | |
| 528 matrix.setDouble(1, 2, m32); | |
| 529 matrix.setDouble(2, 2, m33); | |
| 530 matrix.setDouble(3, 2, m34); | |
| 531 | |
| 532 // Initialize column 4 | |
| 533 matrix.setDouble(0, 3, m41); | |
| 534 matrix.setDouble(1, 3, m42); | |
| 535 matrix.setDouble(2, 3, m43); | |
| 536 matrix.setDouble(3, 3, m44); | |
| 537 | |
| 538 return result; | |
| 539 } | |
| 540 | |
| 541 gfx::Transform MathUtil::createGfxTransform(double a, double b, double c, | |
| 542 double d, double e, double f) | |
| 543 { | |
| 544 gfx::Transform result; | |
| 545 SkMatrix44& matrix = result.matrix(); | |
| 546 matrix.setDouble(0, 0, a); | |
| 547 matrix.setDouble(1, 0, b); | |
| 548 matrix.setDouble(0, 1, c); | |
| 549 matrix.setDouble(1, 1, d); | |
| 550 matrix.setDouble(0, 3, e); | |
| 551 matrix.setDouble(1, 3, f); | |
| 552 | |
| 553 return result; | |
| 554 } | |
| 555 | |
| 556 gfx::Transform operator*(const gfx::Transform& A, const gfx::Transform& B) | |
| 557 { | |
| 558 // Compute A * B. | |
| 559 gfx::Transform result = A; | |
| 560 result.PreconcatTransform(B); | |
| 561 return result; | |
| 562 } | |
| 563 | |
| 398 } // namespace cc | 564 } // namespace cc |
| OLD | NEW |