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 473 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
484 if (inverse) { | 484 if (inverse) { |
485 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); | 485 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); |
486 } | 486 } |
487 return true; | 487 return true; |
488 } | 488 } |
489 if (this->isScaleTranslate()) { | 489 if (this->isScaleTranslate()) { |
490 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { | 490 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { |
491 return false; | 491 return false; |
492 } | 492 } |
493 | 493 |
494 double a00 = fMat[0][0]; | 494 » if (inverse) { |
495 double a11 = fMat[1][1]; | 495 » double invXScale = 1 / fMat[0][0]; |
496 double a22 = fMat[2][2]; | 496 » double invYScale = 1 / fMat[1][1]; |
497 double a30 = fMat[3][0]; | 497 » double invZScale = 1 / fMat[2][2]; |
498 double a31 = fMat[3][1]; | 498 » |
499 double a32 = fMat[3][2]; | 499 inverse->fMat[0][0] = invXScale; |
| 500 » inverse->fMat[0][1] = 0; |
| 501 » inverse->fMat[0][2] = 0; |
| 502 » inverse->fMat[0][3] = 0; |
500 | 503 |
501 double b00 = a00 * a11; | 504 » inverse->fMat[1][0] = 0; |
502 double b07 = -a22 * a30; | 505 » inverse->fMat[1][1] = invYScale; |
503 double b09 = -a22 * a31; | 506 » inverse->fMat[1][2] = 0; |
504 double b11 = a22; | 507 » inverse->fMat[1][3] = 0; |
| 508 » |
| 509 » inverse->fMat[2][0] = 0; |
| 510 inverse->fMat[2][1] = 0; |
| 511 » inverse->fMat[2][2] = invZScale; |
| 512 » inverse->fMat[2][3] = 0; |
| 513 » |
| 514 inverse->fMat[3][0] = -fMat[3][0] * invXScale; |
| 515 inverse->fMat[3][1] = -fMat[3][1] * invYScale; |
| 516 inverse->fMat[3][2] = -fMat[3][2] * invZScale; |
| 517 inverse->fMat[3][3] = 1; |
505 | 518 |
506 // Calculate the determinant | 519 inverse->setTypeMask(this->getType()); |
507 double det = b00 * b11; | |
508 | |
509 double invdet = 1.0 / det; | |
510 // If det is zero, we want to return false. However, we also want to ret
urn false | |
511 // if 1/det overflows to infinity (i.e. det is denormalized). Both of th
ese are | |
512 // handled by checking that 1/det is finite. | |
513 if (!sk_float_isfinite(invdet)) { | |
514 return false; | |
515 } | |
516 if (NULL == inverse) { | |
517 return true; | |
518 } | 520 } |
519 | 521 |
520 b00 *= invdet; | |
521 b07 *= invdet; | |
522 b09 *= invdet; | |
523 b11 *= invdet; | |
524 | |
525 inverse->fMat[0][0] = SkDoubleToMScalar(a11 * b11); | |
526 inverse->fMat[0][1] = 0; | |
527 inverse->fMat[0][2] = 0; | |
528 inverse->fMat[0][3] = 0; | |
529 inverse->fMat[1][0] = 0; | |
530 inverse->fMat[1][1] = SkDoubleToMScalar(a00 * b11); | |
531 inverse->fMat[1][2] = 0; | |
532 inverse->fMat[1][3] = 0; | |
533 inverse->fMat[2][0] = 0; | |
534 inverse->fMat[2][1] = 0; | |
535 inverse->fMat[2][2] = SkDoubleToMScalar(b00); | |
536 inverse->fMat[2][3] = 0; | |
537 inverse->fMat[3][0] = SkDoubleToMScalar(a11 * b07); | |
538 inverse->fMat[3][1] = SkDoubleToMScalar(a00 * b09); | |
539 inverse->fMat[3][2] = SkDoubleToMScalar(-a32 * b00); | |
540 inverse->fMat[3][3] = 1; | |
541 | |
542 inverse->setTypeMask(this->getType()); | |
543 return true; | 522 return true; |
544 } | 523 } |
545 | 524 |
546 double a00 = fMat[0][0]; | 525 double a00 = fMat[0][0]; |
547 double a01 = fMat[0][1]; | 526 double a01 = fMat[0][1]; |
548 double a02 = fMat[0][2]; | 527 double a02 = fMat[0][2]; |
549 double a03 = fMat[0][3]; | 528 double a03 = fMat[0][3]; |
550 double a10 = fMat[1][0]; | 529 double a10 = fMat[1][0]; |
551 double a11 = fMat[1][1]; | 530 double a11 = fMat[1][1]; |
552 double a12 = fMat[1][2]; | 531 double a12 = fMat[1][2]; |
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
968 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); | 947 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); |
969 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); | 948 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); |
970 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); | 949 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); |
971 | 950 |
972 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); | 951 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); |
973 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); | 952 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); |
974 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); | 953 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); |
975 | 954 |
976 return dst; | 955 return dst; |
977 } | 956 } |
OLD | NEW |