| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 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 "SkCodecPriv.h" | 8 #include "SkCodecPriv.h" |
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
| 10 #include "SkOpts.h" | 10 #include "SkOpts.h" |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { | 288 int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 289 | 289 |
| 290 src += offset; | 290 src += offset; |
| 291 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; | 291 uint16_t* SK_RESTRICT dst = (uint16_t*)dstRow; |
| 292 for (int x = 0; x < dstWidth; x++) { | 292 for (int x = 0; x < dstWidth; x++) { |
| 293 dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]); | 293 dst[x] = SkPack888ToRGB16(src[0], src[0], src[0]); |
| 294 src += deltaSrc; | 294 src += deltaSrc; |
| 295 } | 295 } |
| 296 } | 296 } |
| 297 | 297 |
| 298 // kGrayAlpha |
| 299 |
| 300 static void swizzle_grayalpha_to_n32_unpremul( |
| 301 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off
set, |
| 302 const SkPMColor ctable[]) { |
| 303 |
| 304 src += offset; |
| 305 SkPMColor* dst32 = (SkPMColor*) dst; |
| 306 for (int x = 0; x < width; x++) { |
| 307 dst32[x] = SkPackARGB32NoCheck(src[1], src[0], src[0], src[0]); |
| 308 src += deltaSrc; |
| 309 } |
| 310 } |
| 311 |
| 312 static void swizzle_grayalpha_to_n32_premul( |
| 313 void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int off
set, |
| 314 const SkPMColor ctable[]) { |
| 315 |
| 316 src += offset; |
| 317 SkPMColor* dst32 = (SkPMColor*) dst; |
| 318 for (int x = 0; x < width; x++) { |
| 319 uint8_t pmgray = SkMulDiv255Round(src[1], src[0]); |
| 320 dst32[x] = SkPackARGB32NoCheck(src[1], pmgray, pmgray, pmgray); |
| 321 src += deltaSrc; |
| 322 } |
| 323 } |
| 324 |
| 298 // kBGRX | 325 // kBGRX |
| 299 | 326 |
| 300 static void swizzle_bgrx_to_n32( | 327 static void swizzle_bgrx_to_n32( |
| 301 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 328 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 302 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 329 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 303 | 330 |
| 304 src += offset; | 331 src += offset; |
| 305 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; | 332 SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
| 306 for (int x = 0; x < dstWidth; x++) { | 333 for (int x = 0; x < dstWidth; x++) { |
| 307 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); | 334 dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 const uint8_t r = SkMulDiv255Round(src[0], src[3]); | 576 const uint8_t r = SkMulDiv255Round(src[0], src[3]); |
| 550 const uint8_t g = SkMulDiv255Round(src[1], src[3]); | 577 const uint8_t g = SkMulDiv255Round(src[1], src[3]); |
| 551 const uint8_t b = SkMulDiv255Round(src[2], src[3]); | 578 const uint8_t b = SkMulDiv255Round(src[2], src[3]); |
| 552 | 579 |
| 553 dst[x] = SkPack888ToRGB16(r, g, b); | 580 dst[x] = SkPack888ToRGB16(r, g, b); |
| 554 src += deltaSrc; | 581 src += deltaSrc; |
| 555 } | 582 } |
| 556 } | 583 } |
| 557 | 584 |
| 558 template <SkSwizzler::RowProc proc> | 585 template <SkSwizzler::RowProc proc> |
| 586 void SkSwizzler::SkipLeadingGrayAlphaZerosThen( |
| 587 void* dst, const uint8_t* src, int width, |
| 588 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 589 SkASSERT(!ctable); |
| 590 |
| 591 const uint16_t* src16 = (const uint16_t*) (src + offset); |
| 592 uint32_t* dst32 = (uint32_t*) dst; |
| 593 |
| 594 // This may miss opportunities to skip when the output is premultiplied, |
| 595 // e.g. for a src pixel 0x00FF which is not zero but becomes zero after prem
ultiplication. |
| 596 while (width > 0 && *src16 == 0x0000) { |
| 597 width--; |
| 598 dst32++; |
| 599 src16 += deltaSrc / 2; |
| 600 } |
| 601 proc(dst32, (const uint8_t*)src16, width, bpp, deltaSrc, 0, ctable); |
| 602 } |
| 603 |
| 604 template <SkSwizzler::RowProc proc> |
| 559 void SkSwizzler::SkipLeading8888ZerosThen( | 605 void SkSwizzler::SkipLeading8888ZerosThen( |
| 560 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, | 606 void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| 561 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { | 607 int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
| 562 SkASSERT(!ctable); | 608 SkASSERT(!ctable); |
| 563 | 609 |
| 564 auto src32 = (const uint32_t*)(src+offset); | 610 auto src32 = (const uint32_t*)(src+offset); |
| 565 auto dst32 = (uint32_t*)dstRow; | 611 auto dst32 = (uint32_t*)dstRow; |
| 566 | 612 |
| 567 // This may miss opportunities to skip when the output is premultiplied, | 613 // This may miss opportunities to skip when the output is premultiplied, |
| 568 // e.g. for a src pixel 0x00FFFFFF which is not zero but becomes zero after
premultiplication. | 614 // e.g. for a src pixel 0x00FFFFFF which is not zero but becomes zero after
premultiplication. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 proc = &sample1; | 704 proc = &sample1; |
| 659 fastProc = © | 705 fastProc = © |
| 660 break; | 706 break; |
| 661 case kRGB_565_SkColorType: | 707 case kRGB_565_SkColorType: |
| 662 proc = &swizzle_gray_to_565; | 708 proc = &swizzle_gray_to_565; |
| 663 break; | 709 break; |
| 664 default: | 710 default: |
| 665 break; | 711 break; |
| 666 } | 712 } |
| 667 break; | 713 break; |
| 714 case kGrayAlpha: |
| 715 switch (dstInfo.colorType()) { |
| 716 case kN32_SkColorType: |
| 717 if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| 718 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 719 proc = &SkipLeadingGrayAlphaZerosThen |
| 720 <swizzle_grayalpha_to_n32_unpremul>; |
| 721 } else { |
| 722 proc = &swizzle_grayalpha_to_n32_unpremul; |
| 723 } |
| 724 } else { |
| 725 if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| 726 proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayal
pha_to_n32_premul>; |
| 727 } else { |
| 728 proc = &swizzle_grayalpha_to_n32_premul; |
| 729 } |
| 730 } |
| 731 break; |
| 732 default: |
| 733 break; |
| 734 } |
| 735 break; |
| 668 case kBGR: | 736 case kBGR: |
| 669 case kBGRX: | 737 case kBGRX: |
| 670 switch (dstInfo.colorType()) { | 738 switch (dstInfo.colorType()) { |
| 671 case kN32_SkColorType: | 739 case kN32_SkColorType: |
| 672 proc = &swizzle_bgrx_to_n32; | 740 proc = &swizzle_bgrx_to_n32; |
| 673 break; | 741 break; |
| 674 case kRGB_565_SkColorType: | 742 case kRGB_565_SkColorType: |
| 675 proc = &swizzle_bgrx_to_565; | 743 proc = &swizzle_bgrx_to_565; |
| 676 break; | 744 break; |
| 677 default: | 745 default: |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 } | 896 } |
| 829 | 897 |
| 830 return fAllocatedWidth; | 898 return fAllocatedWidth; |
| 831 } | 899 } |
| 832 | 900 |
| 833 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { | 901 void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { |
| 834 SkASSERT(nullptr != dst && nullptr != src); | 902 SkASSERT(nullptr != dst && nullptr != src); |
| 835 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS
rcBPP, | 903 fActualProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fS
rcBPP, |
| 836 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); | 904 fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); |
| 837 } | 905 } |
| OLD | NEW |