| 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 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 } | 399 } |
| 400 | 400 |
| 401 if (useStorage) { | 401 if (useStorage) { |
| 402 memcpy(fMat, storage, sizeof(storage)); | 402 memcpy(fMat, storage, sizeof(storage)); |
| 403 } | 403 } |
| 404 this->dirtyTypeMask(); | 404 this->dirtyTypeMask(); |
| 405 } | 405 } |
| 406 | 406 |
| 407 /////////////////////////////////////////////////////////////////////////////// | 407 /////////////////////////////////////////////////////////////////////////////// |
| 408 | 408 |
| 409 static inline SkMScalar det2x2(double m00, double m01, double m10, double m11) { | |
| 410 return SkDoubleToMScalar(m00 * m11 - m10 * m01); | |
| 411 } | |
| 412 | |
| 413 static inline double det3x3(double m00, double m01, double m02, | |
| 414 double m10, double m11, double m12, | |
| 415 double m20, double m21, double m22) { | |
| 416 return m00 * det2x2(m11, m12, m21, m22) - | |
| 417 m10 * det2x2(m01, m02, m21, m22) + | |
| 418 m20 * det2x2(m01, m02, m11, m12); | |
| 419 } | |
| 420 | |
| 421 /** We always perform the calculation in doubles, to avoid prematurely losing | 409 /** We always perform the calculation in doubles, to avoid prematurely losing |
| 422 precision along the way. This relies on the compiler automatically | 410 precision along the way. This relies on the compiler automatically |
| 423 promoting our SkMScalar values to double (if needed). | 411 promoting our SkMScalar values to double (if needed). |
| 424 */ | 412 */ |
| 425 double SkMatrix44::determinant() const { | 413 double SkMatrix44::determinant() const { |
| 426 if (this->isIdentity()) { | 414 if (this->isIdentity()) { |
| 427 return 1; | 415 return 1; |
| 428 } | 416 } |
| 429 if (this->isScaleTranslate()) { | 417 if (this->isScaleTranslate()) { |
| 430 return fMat[0][0] * fMat[1][1] * fMat[2][2] * fMat[3][3]; | 418 return fMat[0][0] * fMat[1][1] * fMat[2][2] * fMat[3][3]; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 459 double b09 = a21 * a32 - a22 * a31; | 447 double b09 = a21 * a32 - a22 * a31; |
| 460 double b10 = a21 * a33 - a23 * a31; | 448 double b10 = a21 * a33 - a23 * a31; |
| 461 double b11 = a22 * a33 - a23 * a32; | 449 double b11 = a22 * a33 - a23 * a32; |
| 462 | 450 |
| 463 // Calculate the determinant | 451 // Calculate the determinant |
| 464 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
; | 452 return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06
; |
| 465 } | 453 } |
| 466 | 454 |
| 467 /////////////////////////////////////////////////////////////////////////////// | 455 /////////////////////////////////////////////////////////////////////////////// |
| 468 | 456 |
| 469 static inline double dabs(double x) { | |
| 470 if (x < 0) { | |
| 471 x = -x; | |
| 472 } | |
| 473 return x; | |
| 474 } | |
| 475 | |
| 476 bool SkMatrix44::invert(SkMatrix44* inverse) const { | 457 bool SkMatrix44::invert(SkMatrix44* inverse) const { |
| 477 if (this->isIdentity()) { | 458 if (this->isIdentity()) { |
| 478 if (inverse) { | 459 if (inverse) { |
| 479 inverse->setIdentity(); | 460 inverse->setIdentity(); |
| 480 return true; | 461 return true; |
| 481 } | 462 } |
| 482 } | 463 } |
| 483 if (this->isTranslate()) { | 464 if (this->isTranslate()) { |
| 484 if (inverse) { | 465 if (inverse) { |
| 485 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); | 466 inverse->setTranslate(-fMat[3][0], -fMat[3][1], -fMat[3][2]); |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 947 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); | 928 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); |
| 948 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); | 929 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); |
| 949 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); | 930 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); |
| 950 | 931 |
| 951 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); | 932 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); |
| 952 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); | 933 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); |
| 953 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); | 934 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); |
| 954 | 935 |
| 955 return dst; | 936 return dst; |
| 956 } | 937 } |
| OLD | NEW |