Chromium Code Reviews| 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 464 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 475 } | 475 } |
| 476 return true; | 476 return true; |
| 477 } | 477 } |
| 478 if (this->isScaleTranslate()) { | 478 if (this->isScaleTranslate()) { |
| 479 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { | 479 if (0 == fMat[0][0] * fMat[1][1] * fMat[2][2]) { |
| 480 return false; | 480 return false; |
| 481 } | 481 } |
| 482 if (inverse) { | 482 if (inverse) { |
| 483 sk_bzero(inverse->fMat, sizeof(inverse->fMat)); | 483 sk_bzero(inverse->fMat, sizeof(inverse->fMat)); |
| 484 | 484 |
| 485 inverse->fMat[3][0] = -fMat[3][0] / fMat[0][0]; | 485 double invXScale = 1 / fMat[0][0]; |
| 486 inverse->fMat[3][1] = -fMat[3][1] / fMat[1][1]; | 486 double invYScale = 1 / fMat[1][1]; |
| 487 inverse->fMat[3][2] = -fMat[3][2] / fMat[2][2]; | 487 double invZScale = 1 / fMat[2][2]; |
| 488 | 488 |
| 489 inverse->fMat[0][0] = 1 / fMat[0][0]; | 489 inverse->fMat[3][0] = -fMat[3][0] * invXScale; |
| 490 inverse->fMat[1][1] = 1 / fMat[1][1]; | 490 inverse->fMat[3][1] = -fMat[3][1] * invYScale; |
| 491 inverse->fMat[2][2] = 1 / fMat[2][2]; | 491 inverse->fMat[3][2] = -fMat[3][2] * invZScale; |
| 492 | |
| 493 inverse->fMat[0][0] = invXScale; | |
| 494 inverse->fMat[1][1] = invYScale; | |
| 495 inverse->fMat[2][2] = invZScale; | |
| 492 inverse->fMat[3][3] = 1; | 496 inverse->fMat[3][3] = 1; |
| 493 | 497 |
| 494 inverse->setTypeMask(this->getType()); | 498 inverse->setTypeMask(this->getType()); |
| 495 } | 499 } |
| 496 return true; | 500 return true; |
| 497 } | 501 } |
| 498 | 502 |
| 499 double a00 = fMat[0][0]; | 503 double a00 = fMat[0][0]; |
| 500 double a01 = fMat[0][1]; | 504 double a01 = fMat[0][1]; |
| 501 double a02 = fMat[0][2]; | 505 double a02 = fMat[0][2]; |
| 502 double a03 = fMat[0][3]; | 506 double a03 = fMat[0][3]; |
| 503 double a10 = fMat[1][0]; | 507 double a10 = fMat[1][0]; |
| 504 double a11 = fMat[1][1]; | 508 double a11 = fMat[1][1]; |
| 505 double a12 = fMat[1][2]; | 509 double a12 = fMat[1][2]; |
| 506 double a13 = fMat[1][3]; | 510 double a13 = fMat[1][3]; |
| 507 double a20 = fMat[2][0]; | 511 double a20 = fMat[2][0]; |
| 508 double a21 = fMat[2][1]; | 512 double a21 = fMat[2][1]; |
| 509 double a22 = fMat[2][2]; | 513 double a22 = fMat[2][2]; |
| 510 double a23 = fMat[2][3]; | 514 double a23 = fMat[2][3]; |
| 511 double a30 = fMat[3][0]; | 515 double a30 = fMat[3][0]; |
| 512 double a31 = fMat[3][1]; | 516 double a31 = fMat[3][1]; |
| 513 double a32 = fMat[3][2]; | 517 double a32 = fMat[3][2]; |
| 514 double a33 = fMat[3][3]; | 518 double a33 = fMat[3][3]; |
| 515 | 519 |
|
jvanverth1
2013/08/19 20:41:44
Did you try optimizing this and the determinant in
| |
| 516 double b00 = a00 * a11 - a01 * a10; | 520 double b00 = a00 * a11 - a01 * a10; |
| 517 double b01 = a00 * a12 - a02 * a10; | 521 double b01 = a00 * a12 - a02 * a10; |
| 518 double b02 = a00 * a13 - a03 * a10; | 522 double b02 = a00 * a13 - a03 * a10; |
| 519 double b03 = a01 * a12 - a02 * a11; | 523 double b03 = a01 * a12 - a02 * a11; |
| 520 double b04 = a01 * a13 - a03 * a11; | 524 double b04 = a01 * a13 - a03 * a11; |
| 521 double b05 = a02 * a13 - a03 * a12; | 525 double b05 = a02 * a13 - a03 * a12; |
| 522 double b06 = a20 * a31 - a21 * a30; | 526 double b06 = a20 * a31 - a21 * a30; |
| 523 double b07 = a20 * a32 - a22 * a30; | 527 double b07 = a20 * a32 - a22 * a30; |
| 524 double b08 = a20 * a33 - a23 * a30; | 528 double b08 = a20 * a33 - a23 * a30; |
| 525 double b09 = a21 * a32 - a22 * a31; | 529 double b09 = a21 * a32 - a22 * a31; |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 542 b02 *= invdet; | 546 b02 *= invdet; |
| 543 b03 *= invdet; | 547 b03 *= invdet; |
| 544 b04 *= invdet; | 548 b04 *= invdet; |
| 545 b05 *= invdet; | 549 b05 *= invdet; |
| 546 b06 *= invdet; | 550 b06 *= invdet; |
| 547 b07 *= invdet; | 551 b07 *= invdet; |
| 548 b08 *= invdet; | 552 b08 *= invdet; |
| 549 b09 *= invdet; | 553 b09 *= invdet; |
| 550 b10 *= invdet; | 554 b10 *= invdet; |
| 551 b11 *= invdet; | 555 b11 *= invdet; |
| 552 | 556 |
|
jvanverth1
2013/08/19 20:41:44
Looks like there should be some optimization fruit
| |
| 553 inverse->fMat[0][0] = SkDoubleToMScalar(a11 * b11 - a12 * b10 + a13 * b09); | 557 inverse->fMat[0][0] = SkDoubleToMScalar(a11 * b11 - a12 * b10 + a13 * b09); |
| 554 inverse->fMat[0][1] = SkDoubleToMScalar(a02 * b10 - a01 * b11 - a03 * b09); | 558 inverse->fMat[0][1] = SkDoubleToMScalar(a02 * b10 - a01 * b11 - a03 * b09); |
| 555 inverse->fMat[0][2] = SkDoubleToMScalar(a31 * b05 - a32 * b04 + a33 * b03); | 559 inverse->fMat[0][2] = SkDoubleToMScalar(a31 * b05 - a32 * b04 + a33 * b03); |
| 556 inverse->fMat[0][3] = SkDoubleToMScalar(a22 * b04 - a21 * b05 - a23 * b03); | |
| 557 inverse->fMat[1][0] = SkDoubleToMScalar(a12 * b08 - a10 * b11 - a13 * b07); | 560 inverse->fMat[1][0] = SkDoubleToMScalar(a12 * b08 - a10 * b11 - a13 * b07); |
| 558 inverse->fMat[1][1] = SkDoubleToMScalar(a00 * b11 - a02 * b08 + a03 * b07); | 561 inverse->fMat[1][1] = SkDoubleToMScalar(a00 * b11 - a02 * b08 + a03 * b07); |
| 559 inverse->fMat[1][2] = SkDoubleToMScalar(a32 * b02 - a30 * b05 - a33 * b01); | 562 inverse->fMat[1][2] = SkDoubleToMScalar(a32 * b02 - a30 * b05 - a33 * b01); |
| 560 inverse->fMat[1][3] = SkDoubleToMScalar(a20 * b05 - a22 * b02 + a23 * b01); | |
| 561 inverse->fMat[2][0] = SkDoubleToMScalar(a10 * b10 - a11 * b08 + a13 * b06); | 563 inverse->fMat[2][0] = SkDoubleToMScalar(a10 * b10 - a11 * b08 + a13 * b06); |
| 562 inverse->fMat[2][1] = SkDoubleToMScalar(a01 * b08 - a00 * b10 - a03 * b06); | 564 inverse->fMat[2][1] = SkDoubleToMScalar(a01 * b08 - a00 * b10 - a03 * b06); |
| 563 inverse->fMat[2][2] = SkDoubleToMScalar(a30 * b04 - a31 * b02 + a33 * b00); | 565 inverse->fMat[2][2] = SkDoubleToMScalar(a30 * b04 - a31 * b02 + a33 * b00); |
| 564 inverse->fMat[2][3] = SkDoubleToMScalar(a21 * b02 - a20 * b04 - a23 * b00); | |
| 565 inverse->fMat[3][0] = SkDoubleToMScalar(a11 * b07 - a10 * b09 - a12 * b06); | 566 inverse->fMat[3][0] = SkDoubleToMScalar(a11 * b07 - a10 * b09 - a12 * b06); |
| 566 inverse->fMat[3][1] = SkDoubleToMScalar(a00 * b09 - a01 * b07 + a02 * b06); | 567 inverse->fMat[3][1] = SkDoubleToMScalar(a00 * b09 - a01 * b07 + a02 * b06); |
| 567 inverse->fMat[3][2] = SkDoubleToMScalar(a31 * b01 - a30 * b03 - a32 * b00); | 568 inverse->fMat[3][2] = SkDoubleToMScalar(a31 * b01 - a30 * b03 - a32 * b00); |
| 568 inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b00); | 569 |
| 569 inverse->dirtyTypeMask(); | 570 |
| 571 if (this->getType() & kPerspective_Mask) { | |
| 572 inverse->fMat[0][3] = SkDoubleToMScalar(a22 * b04 - a21 * b05 - a23 * b0 3); | |
| 573 inverse->fMat[1][3] = SkDoubleToMScalar(a20 * b05 - a22 * b02 + a23 * b0 1); | |
| 574 inverse->fMat[2][3] = SkDoubleToMScalar(a21 * b02 - a20 * b04 - a23 * b0 0); | |
| 575 inverse->fMat[3][3] = SkDoubleToMScalar(a20 * b03 - a21 * b01 + a22 * b0 0); | |
| 576 } | |
| 577 else { | |
| 578 inverse->fMat[0][3] = 0; | |
| 579 inverse->fMat[1][3] = 0; | |
| 580 inverse->fMat[2][3] = 0; | |
| 581 inverse->fMat[3][3] = 1; | |
| 582 } | |
| 570 | 583 |
| 571 inverse->dirtyTypeMask(); | 584 inverse->dirtyTypeMask(); |
| 572 return true; | 585 return true; |
| 573 } | 586 } |
| 574 | 587 |
| 575 /////////////////////////////////////////////////////////////////////////////// | 588 /////////////////////////////////////////////////////////////////////////////// |
| 576 | 589 |
| 577 void SkMatrix44::transpose() { | 590 void SkMatrix44::transpose() { |
| 578 SkTSwap(fMat[0][1], fMat[1][0]); | 591 SkTSwap(fMat[0][1], fMat[1][0]); |
| 579 SkTSwap(fMat[0][2], fMat[2][0]); | 592 SkTSwap(fMat[0][2], fMat[2][0]); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 845 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); | 858 dst[SkMatrix::kMScaleX] = SkMScalarToScalar(fMat[0][0]); |
| 846 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); | 859 dst[SkMatrix::kMSkewX] = SkMScalarToScalar(fMat[1][0]); |
| 847 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); | 860 dst[SkMatrix::kMTransX] = SkMScalarToScalar(fMat[3][0]); |
| 848 | 861 |
| 849 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); | 862 dst[SkMatrix::kMSkewY] = SkMScalarToScalar(fMat[0][1]); |
| 850 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); | 863 dst[SkMatrix::kMScaleY] = SkMScalarToScalar(fMat[1][1]); |
| 851 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); | 864 dst[SkMatrix::kMTransY] = SkMScalarToScalar(fMat[3][1]); |
| 852 | 865 |
| 853 return dst; | 866 return dst; |
| 854 } | 867 } |
| OLD | NEW |