OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkMatrix44.h" | 8 #include "SkMatrix44.h" |
9 | 9 |
10 static inline bool eq4(const SkMScalar* SK_RESTRICT a, | 10 static inline bool eq4(const SkMScalar* SK_RESTRICT a, |
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 // Calculate the determinant | 445 // Calculate the determinant |
446 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
; | 446 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
; |
447 } | 447 } |
448 | 448 |
449 /////////////////////////////////////////////////////////////////////////////// | 449 /////////////////////////////////////////////////////////////////////////////// |
450 | 450 |
451 bool SkMatrix44::invert(SkMatrix44* inverse) const { | 451 bool SkMatrix44::invert(SkMatrix44* inverse) const { |
452 if (this->isIdentity()) { | 452 if (this->isIdentity()) { |
453 if (inverse) { | 453 if (inverse) { |
454 inverse->setIdentity(); | 454 inverse->setIdentity(); |
455 return true; | |
456 } | 455 } |
| 456 return true; |
457 } | 457 } |
| 458 |
458 if (this->isTranslate()) { | 459 if (this->isTranslate()) { |
459 if (inverse) { | 460 if (inverse) { |
460 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); | 461 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); |
461 } | 462 } |
462 return true; | 463 return true; |
463 } | 464 } |
| 465 |
464 if (this->isScaleTranslate()) { | 466 if (this->isScaleTranslate()) { |
465 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { | 467 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { |
466 return false; | 468 return false; |
467 } | 469 } |
468 | 470 |
469 if (inverse) { | 471 if (inverse) { |
470 double invXScale = 1 / fMat[0][0]; | 472 double invXScale = 1 / fMat[0][0]; |
471 double invYScale = 1 / fMat[1][1]; | 473 double invYScale = 1 / fMat[1][1]; |
472 double invZScale = 1 / fMat[2][2]; | 474 double invZScale = 1 / fMat[2][2]; |
473 | 475 |
474 inverse->fMat[0][0] = invXScale; | 476 inverse->fMat[0][0] = invXScale; |
475 inverse->fMat[0][1] = 0; | 477 inverse->fMat[0][1] = 0; |
476 inverse->fMat[0][2] = 0; | 478 inverse->fMat[0][2] = 0; |
477 inverse->fMat[0][3] = 0; | 479 inverse->fMat[0][3] = 0; |
478 | 480 |
479 inverse->fMat[1][0] = 0; | 481 inverse->fMat[1][0] = 0; |
480 inverse->fMat[1][1] = invYScale; | 482 inverse->fMat[1][1] = invYScale; |
481 inverse->fMat[1][2] = 0; | 483 inverse->fMat[1][2] = 0; |
482 inverse->fMat[1][3] = 0; | 484 inverse->fMat[1][3] = 0; |
483 | 485 |
484 inverse->fMat[2][0] = 0; | 486 inverse->fMat[2][0] = 0; |
485 inverse->fMat[2][1] = 0; | 487 inverse->fMat[2][1] = 0; |
486 inverse->fMat[2][2] = invZScale; | 488 inverse->fMat[2][2] = invZScale; |
487 inverse->fMat[2][3] = 0; | 489 inverse->fMat[2][3] = 0; |
488 | 490 |
489 inverse->fMat[3][0] = -fMat[3][0] * invXScale; | 491 inverse->fMat[3][0] = -fMat[3][0] * invXScale; |
490 inverse->fMat[3][1] = -fMat[3][1] * invYScale; | 492 inverse->fMat[3][1] = -fMat[3][1] * invYScale; |
491 inverse->fMat[3][2] = -fMat[3][2] * invZScale; | 493 inverse->fMat[3][2] = -fMat[3][2] * invZScale; |
492 inverse->fMat[3][3] = 1; | 494 inverse->fMat[3][3] = 1; |
493 | 495 |
494 inverse->setTypeMask(this->getType()); | 496 inverse->setTypeMask(this->getType()); |
495 } | 497 } |
496 | 498 |
497 return true; | 499 return true; |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
921 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); | 923 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); |
922 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); | 924 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); |
923 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); | 925 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); |
924 | 926 |
925 dst[SkMatrix::kMPersp0] = SkMScalarToScalar(fMat[0][3]); | 927 dst[SkMatrix::kMPersp0] = SkMScalarToScalar(fMat[0][3]); |
926 dst[SkMatrix::kMPersp1] = SkMScalarToScalar(fMat[1][3]); | 928 dst[SkMatrix::kMPersp1] = SkMScalarToScalar(fMat[1][3]); |
927 dst[SkMatrix::kMPersp2] = SkMScalarToScalar(fMat[3][3]); | 929 dst[SkMatrix::kMPersp2] = SkMScalarToScalar(fMat[3][3]); |
928 | 930 |
929 return dst; | 931 return dst; |
930 } | 932 } |
OLD | NEW |