| 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 "SkBitmapCache.h" | 8 #include "SkBitmapCache.h" |
| 9 #include "SkBitmapController.h" | 9 #include "SkBitmapController.h" |
| 10 #include "SkBitmapProcState.h" | 10 #include "SkBitmapProcState.h" |
| (...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 | 493 |
| 494 if (s.fInvType > SkMatrix::kTranslate_Mask) { | 494 if (s.fInvType > SkMatrix::kTranslate_Mask) { |
| 495 const SkBitmapProcStateAutoMapper mapper(s, x, y); | 495 const SkBitmapProcStateAutoMapper mapper(s, x, y); |
| 496 | 496 |
| 497 // When the matrix has a scale component the setup code in | 497 // When the matrix has a scale component the setup code in |
| 498 // chooseProcs multiples the inverse matrix by the inverse of the | 498 // chooseProcs multiples the inverse matrix by the inverse of the |
| 499 // bitmap's width and height. Since this method is going to do | 499 // bitmap's width and height. Since this method is going to do |
| 500 // its own tiling and sampling we need to undo that here. | 500 // its own tiling and sampling we need to undo that here. |
| 501 if (SkShader::kClamp_TileMode != s.fTileModeX || | 501 if (SkShader::kClamp_TileMode != s.fTileModeX || |
| 502 SkShader::kClamp_TileMode != s.fTileModeY) { | 502 SkShader::kClamp_TileMode != s.fTileModeY) { |
| 503 yTemp = SkFractionalIntToInt(mapper.y() * s.fPixmap.height()); | 503 yTemp = SkFractionalIntToInt(mapper.fractionalIntY() * s.fPixmap
.height()); |
| 504 } else { | 504 } else { |
| 505 yTemp = SkFractionalIntToInt(mapper.y()); | 505 yTemp = mapper.intY(); |
| 506 } | 506 } |
| 507 } else { | 507 } else { |
| 508 yTemp = s.fFilterOneY + y; | 508 yTemp = s.fFilterOneY + y; |
| 509 } | 509 } |
| 510 | 510 |
| 511 const int stopY = s.fPixmap.height(); | 511 const int stopY = s.fPixmap.height(); |
| 512 switch (s.fTileModeY) { | 512 switch (s.fTileModeY) { |
| 513 case SkShader::kClamp_TileMode: | 513 case SkShader::kClamp_TileMode: |
| 514 iY0 = SkClampMax(yTemp, stopY-1); | 514 iY0 = SkClampMax(yTemp, stopY-1); |
| 515 break; | 515 break; |
| 516 case SkShader::kRepeat_TileMode: | 516 case SkShader::kRepeat_TileMode: |
| 517 iY0 = sk_int_mod(yTemp, stopY); | 517 iY0 = sk_int_mod(yTemp, stopY); |
| 518 break; | 518 break; |
| 519 case SkShader::kMirror_TileMode: | 519 case SkShader::kMirror_TileMode: |
| 520 default: | 520 default: |
| 521 iY0 = sk_int_mirror(yTemp, stopY); | 521 iY0 = sk_int_mirror(yTemp, stopY); |
| 522 break; | 522 break; |
| 523 } | 523 } |
| 524 | 524 |
| 525 #ifdef SK_DEBUG | 525 #ifdef SK_DEBUG |
| 526 { | 526 { |
| 527 const SkBitmapProcStateAutoMapper mapper(s, x, y); | 527 const SkBitmapProcStateAutoMapper mapper(s, x, y); |
| 528 int iY2; | 528 int iY2; |
| 529 | 529 |
| 530 if (s.fInvType > SkMatrix::kTranslate_Mask && | 530 if (s.fInvType > SkMatrix::kTranslate_Mask && |
| 531 (SkShader::kClamp_TileMode != s.fTileModeX || | 531 (SkShader::kClamp_TileMode != s.fTileModeX || |
| 532 SkShader::kClamp_TileMode != s.fTileModeY)) { | 532 SkShader::kClamp_TileMode != s.fTileModeY)) { |
| 533 iY2 = SkFractionalIntToInt(mapper.y() * s.fPixmap.height()); | 533 iY2 = SkFractionalIntToInt(mapper.fractionalIntY() * s.fPixmap.h
eight()); |
| 534 } else { | 534 } else { |
| 535 iY2 = SkFractionalIntToInt(mapper.y()); | 535 iY2 = mapper.intY(); |
| 536 } | 536 } |
| 537 | 537 |
| 538 switch (s.fTileModeY) { | 538 switch (s.fTileModeY) { |
| 539 case SkShader::kClamp_TileMode: | 539 case SkShader::kClamp_TileMode: |
| 540 iY2 = SkClampMax(iY2, stopY-1); | 540 iY2 = SkClampMax(iY2, stopY-1); |
| 541 break; | 541 break; |
| 542 case SkShader::kRepeat_TileMode: | 542 case SkShader::kRepeat_TileMode: |
| 543 iY2 = sk_int_mod(iY2, stopY); | 543 iY2 = sk_int_mod(iY2, stopY); |
| 544 break; | 544 break; |
| 545 case SkShader::kMirror_TileMode: | 545 case SkShader::kMirror_TileMode: |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 * negate it. | 591 * negate it. |
| 592 */ | 592 */ |
| 593 const SkScalar too_big = SkIntToScalar(1 << 30); | 593 const SkScalar too_big = SkIntToScalar(1 << 30); |
| 594 if (SkScalarAbs(pt.fX) > too_big || SkScalarAbs(pt.fY) > too_big) { | 594 if (SkScalarAbs(pt.fX) > too_big || SkScalarAbs(pt.fY) > too_big) { |
| 595 return false; | 595 return false; |
| 596 } | 596 } |
| 597 | 597 |
| 598 // Since we know we're not filtered, we re-purpose these fields allow | 598 // Since we know we're not filtered, we re-purpose these fields allow |
| 599 // us to go from device -> src coordinates w/ just an integer add, | 599 // us to go from device -> src coordinates w/ just an integer add, |
| 600 // rather than running through the inverse-matrix | 600 // rather than running through the inverse-matrix |
| 601 fFilterOneX = SkFractionalIntToInt(mapper.x()); | 601 fFilterOneX = mapper.intX(); |
| 602 fFilterOneY = SkFractionalIntToInt(mapper.y()); | 602 fFilterOneY = mapper.intY(); |
| 603 | 603 |
| 604 return true; | 604 return true; |
| 605 } | 605 } |
| 606 | 606 |
| 607 SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() { | 607 SkBitmapProcState::ShaderProc32 SkBitmapProcState::chooseShaderProc32() { |
| 608 | 608 |
| 609 if (kN32_SkColorType != fPixmap.colorType()) { | 609 if (kN32_SkColorType != fPixmap.colorType()) { |
| 610 return nullptr; | 610 return nullptr; |
| 611 } | 611 } |
| 612 | 612 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn); | 774 const SkBitmapProcState& s = *static_cast<const SkBitmapProcState*>(sIn); |
| 775 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | | 775 SkASSERT((s.fInvType & ~(SkMatrix::kTranslate_Mask | |
| 776 SkMatrix::kScale_Mask)) == 0); | 776 SkMatrix::kScale_Mask)) == 0); |
| 777 | 777 |
| 778 const unsigned maxX = s.fPixmap.width() - 1; | 778 const unsigned maxX = s.fPixmap.width() - 1; |
| 779 SkFractionalInt fx; | 779 SkFractionalInt fx; |
| 780 int dstY; | 780 int dstY; |
| 781 { | 781 { |
| 782 const SkBitmapProcStateAutoMapper mapper(s, x, y); | 782 const SkBitmapProcStateAutoMapper mapper(s, x, y); |
| 783 const unsigned maxY = s.fPixmap.height() - 1; | 783 const unsigned maxY = s.fPixmap.height() - 1; |
| 784 dstY = SkClampMax(SkFractionalIntToInt(mapper.y()), maxY); | 784 dstY = SkClampMax(mapper.intY(), maxY); |
| 785 fx = mapper.x(); | 785 fx = mapper.fractionalIntX(); |
| 786 } | 786 } |
| 787 | 787 |
| 788 const SkPMColor* SK_RESTRICT src = s.fPixmap.addr32(0, dstY); | 788 const SkPMColor* SK_RESTRICT src = s.fPixmap.addr32(0, dstY); |
| 789 const SkFractionalInt dx = s.fInvSxFractionalInt; | 789 const SkFractionalInt dx = s.fInvSxFractionalInt; |
| 790 | 790 |
| 791 // Check if we're safely inside [0...maxX] so no need to clamp each computed
index. | 791 // Check if we're safely inside [0...maxX] so no need to clamp each computed
index. |
| 792 // | 792 // |
| 793 if ((uint64_t)SkFractionalIntToInt(fx) <= maxX && | 793 if ((uint64_t)SkFractionalIntToInt(fx) <= maxX && |
| 794 (uint64_t)SkFractionalIntToInt(fx + dx * (count - 1)) <= maxX) | 794 (uint64_t)SkFractionalIntToInt(fx + dx * (count - 1)) <= maxX) |
| 795 { | 795 { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 812 fx += dx; | 812 fx += dx; |
| 813 } | 813 } |
| 814 } else { | 814 } else { |
| 815 for (int i = 0; i < count; ++i) { | 815 for (int i = 0; i < count; ++i) { |
| 816 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; | 816 dst[i] = src[SkClampMax(SkFractionalIntToInt(fx), maxX)]; |
| 817 fx += dx; | 817 fx += dx; |
| 818 } | 818 } |
| 819 } | 819 } |
| 820 } | 820 } |
| 821 | 821 |
| OLD | NEW |