| 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 |