Chromium Code Reviews| Index: src/codec/SkSwizzler.cpp |
| diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp |
| index 133736879f203e53e5962dab4a4530ad3f5f93f7..5e597f5c74793afa5cf801c856b1c0a890b57c76 100644 |
| --- a/src/codec/SkSwizzler.cpp |
| +++ b/src/codec/SkSwizzler.cpp |
| @@ -40,16 +40,6 @@ static void sample2(void* dst, const uint8_t* src, int width, int bpp, int delta |
| } |
| } |
| -static void sample4(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
| - const SkPMColor ctable[]) { |
| - src += offset; |
| - uint32_t* dst32 = (uint32_t*) dst; |
| - for (int x = 0; x < width; x++) { |
| - dst32[x] = *((const uint32_t*) src); |
| - src += deltaSrc; |
| - } |
| -} |
| - |
| // kBit |
| // These routines exclusively choose between white and black |
| @@ -661,127 +651,175 @@ void SkSwizzler::SkipLeading8888ZerosThen( |
| proc(dst32, (const uint8_t*)src32, dstWidth, bpp, deltaSrc, 0, ctable); |
| } |
| -SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| +SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
| const SkPMColor* ctable, |
| const SkImageInfo& dstInfo, |
| const SkCodec::Options& options, |
| const SkIRect* frame) { |
| - if (dstInfo.colorType() == kUnknown_SkColorType || kUnknown == sc) { |
| - return nullptr; |
| - } |
| - if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) |
| - && nullptr == ctable) { |
| + if (SkEncodedInfo::kPalette_Color == encodedInfo.color() && nullptr == ctable) { |
| return nullptr; |
| } |
| + |
| RowProc fastProc = nullptr; |
| RowProc proc = nullptr; |
| SkCodec::ZeroInitialized zeroInit = options.fZeroInitialized; |
| - switch (sc) { |
| - case kBit: |
| - switch (dstInfo.colorType()) { |
| - case kN32_SkColorType: |
| - proc = &swizzle_bit_to_n32; |
| - break; |
| - case kIndex_8_SkColorType: |
| - proc = &swizzle_bit_to_index; |
| - break; |
| - case kRGB_565_SkColorType: |
| - proc = &swizzle_bit_to_565; |
| + bool premultiply = (SkEncodedInfo::kOpaque_Alpha != encodedInfo.alpha()) && |
|
scroggo
2016/04/21 15:09:11
nit: could be const?
msarett
2016/04/21 16:03:41
Done.
|
| + (kPremul_SkAlphaType == dstInfo.alphaType()); |
| + switch (encodedInfo.color()) { |
| + case SkEncodedInfo::kGray_Color: |
| + switch (encodedInfo.bitsPerComponent()) { |
| + case 1: |
| + switch (dstInfo.colorType()) { |
| + case kN32_SkColorType: |
| + proc = &swizzle_bit_to_n32; |
| + break; |
| + case kIndex_8_SkColorType: |
| + proc = &swizzle_bit_to_index; |
| + break; |
| + case kRGB_565_SkColorType: |
| + proc = &swizzle_bit_to_565; |
| + break; |
| + case kGray_8_SkColorType: |
| + proc = &swizzle_bit_to_grayscale; |
| + break; |
| + default: |
| + return nullptr; |
| + } |
| break; |
| - case kGray_8_SkColorType: |
| - proc = &swizzle_bit_to_grayscale; |
| + case 8: |
| + switch (dstInfo.colorType()) { |
| + case kN32_SkColorType: |
| + proc = &swizzle_gray_to_n32; |
| + fastProc = &fast_swizzle_gray_to_n32; |
| + break; |
| + case kGray_8_SkColorType: |
| + proc = &sample1; |
| + fastProc = © |
| + break; |
| + case kRGB_565_SkColorType: |
| + proc = &swizzle_gray_to_565; |
| + break; |
| + default: |
| + return nullptr; |
| + } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kIndex1: |
| - case kIndex2: |
| - case kIndex4: |
| + case SkEncodedInfo::kGrayAlpha_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_small_index_to_n32; |
| - break; |
| - case kRGB_565_SkColorType: |
| - proc = &swizzle_small_index_to_565; |
| - break; |
| - case kIndex_8_SkColorType: |
| - proc = &swizzle_small_index_to_index; |
| + if (premultiply) { |
| + if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| + proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayalpha_to_n32_premul>; |
| + fastProc = &SkipLeadingGrayAlphaZerosThen |
| + <fast_swizzle_grayalpha_to_n32_premul>; |
| + } else { |
| + proc = &swizzle_grayalpha_to_n32_premul; |
| + fastProc = &fast_swizzle_grayalpha_to_n32_premul; |
| + } |
| + } else { |
| + if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| + proc = &SkipLeadingGrayAlphaZerosThen |
| + <swizzle_grayalpha_to_n32_unpremul>; |
| + fastProc = &SkipLeadingGrayAlphaZerosThen |
| + <fast_swizzle_grayalpha_to_n32_unpremul>; |
| + } else { |
| + proc = &swizzle_grayalpha_to_n32_unpremul; |
| + fastProc = &fast_swizzle_grayalpha_to_n32_unpremul; |
| + } |
| + } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kIndex: |
| - switch (dstInfo.colorType()) { |
| - case kN32_SkColorType: |
| - // We assume the color premultiplied ctable (or not) as desired. |
| - if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &swizzle_index_to_n32_skipZ; |
| - break; |
| - } else { |
| - proc = &swizzle_index_to_n32; |
| - break; |
| + case SkEncodedInfo::kPalette_Color: |
| + // We assumes that the color table is premultiplied and swizzled |
|
scroggo
2016/04/21 15:09:11
assume*
msarett
2016/04/21 16:03:41
Done.
|
| + // as desired. |
| + switch (encodedInfo.bitsPerComponent()) { |
| + case 1: |
| + case 2: |
| + case 4: |
| + switch (dstInfo.colorType()) { |
| + case kN32_SkColorType: |
| + proc = &swizzle_small_index_to_n32; |
| + break; |
| + case kRGB_565_SkColorType: |
| + proc = &swizzle_small_index_to_565; |
| + break; |
| + case kIndex_8_SkColorType: |
| + proc = &swizzle_small_index_to_index; |
| + break; |
| + default: |
| + return nullptr; |
| } |
| break; |
| - case kRGB_565_SkColorType: |
| - proc = &swizzle_index_to_565; |
| - break; |
| - case kIndex_8_SkColorType: |
| - proc = &sample1; |
| - fastProc = © |
| + case 8: |
| + switch (dstInfo.colorType()) { |
| + case kN32_SkColorType: |
| + if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| + proc = &swizzle_index_to_n32_skipZ; |
| + } else { |
| + proc = &swizzle_index_to_n32; |
| + } |
| + break; |
| + case kRGB_565_SkColorType: |
| + proc = &swizzle_index_to_565; |
| + break; |
| + case kIndex_8_SkColorType: |
| + proc = &sample1; |
| + fastProc = © |
| + break; |
| + default: |
| + return nullptr; |
| + } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kGray: |
| + case SkEncodedInfo::kRGB_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_gray_to_n32; |
| - fastProc = &fast_swizzle_gray_to_n32; |
| - break; |
| - case kGray_8_SkColorType: |
| - proc = &sample1; |
| - fastProc = © |
| + proc = &swizzle_rgb_to_n32; |
| + fastProc = &fast_swizzle_rgb_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_gray_to_565; |
| + proc = &swizzle_rgb_to_565; |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kGrayAlpha: |
| + case SkEncodedInfo::kRGBA_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| + if (premultiply) { |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeadingGrayAlphaZerosThen |
| - <swizzle_grayalpha_to_n32_unpremul>; |
| - fastProc = &SkipLeadingGrayAlphaZerosThen |
| - <fast_swizzle_grayalpha_to_n32_unpremul>; |
| + proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_premul>; |
| + fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_n32_premul>; |
| } else { |
| - proc = &swizzle_grayalpha_to_n32_unpremul; |
| - fastProc = &fast_swizzle_grayalpha_to_n32_unpremul; |
| + proc = &swizzle_rgba_to_n32_premul; |
| + fastProc = &fast_swizzle_rgba_to_n32_premul; |
| } |
| } else { |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayalpha_to_n32_premul>; |
| - fastProc = &SkipLeadingGrayAlphaZerosThen |
| - <fast_swizzle_grayalpha_to_n32_premul>; |
| + proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
| + fastProc = &SkipLeading8888ZerosThen |
| + <fast_swizzle_rgba_to_n32_unpremul>; |
| } else { |
| - proc = &swizzle_grayalpha_to_n32_premul; |
| - fastProc = &fast_swizzle_grayalpha_to_n32_premul; |
| + proc = &swizzle_rgba_to_n32_unpremul; |
| + fastProc = &fast_swizzle_rgba_to_n32_unpremul; |
| } |
| } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kBGR: |
| - case kBGRX: |
| + case SkEncodedInfo::kBGR_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| proc = &swizzle_bgrx_to_n32; |
| @@ -790,73 +828,48 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| proc = &swizzle_bgrx_to_565; |
| break; |
| default: |
| - break; |
| - } |
| - break; |
| - case kBGRA: |
| - switch (dstInfo.colorType()) { |
| - case kN32_SkColorType: |
| - if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| - if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_unpremul>; |
| - fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgra_to_n32_unpremul>; |
| - } else { |
| - proc = &swizzle_bgra_to_n32_unpremul; |
| - fastProc = &fast_swizzle_bgra_to_n32_unpremul; |
| - } |
| - } else { |
| - if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_premul>; |
| - fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgra_to_n32_premul>; |
| - } else { |
| - proc = &swizzle_bgra_to_n32_premul; |
| - fastProc = &fast_swizzle_bgra_to_n32_premul; |
| - } |
| - } |
| - break; |
| - default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kRGB: |
| + case SkEncodedInfo::kBGRX_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_rgb_to_n32; |
| - fastProc = &fast_swizzle_rgb_to_n32; |
| + proc = &swizzle_bgrx_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_rgb_to_565; |
| + proc = &swizzle_bgrx_to_565; |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kRGBA: |
| + case SkEncodedInfo::kBGRA_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| + if (premultiply) { |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
| - fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_n32_unpremul>; |
| + proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_premul>; |
| + fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgra_to_n32_premul>; |
| } else { |
| - proc = &swizzle_rgba_to_n32_unpremul; |
| - fastProc = &fast_swizzle_rgba_to_n32_unpremul; |
| + proc = &swizzle_bgra_to_n32_premul; |
| + fastProc = &fast_swizzle_bgra_to_n32_premul; |
| } |
| } else { |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_premul>; |
| - fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_n32_premul>; |
| + proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
| + fastProc = &SkipLeading8888ZerosThen |
| + <fast_swizzle_bgra_to_n32_unpremul>; |
| } else { |
| - proc = &swizzle_rgba_to_n32_premul; |
| - fastProc = &fast_swizzle_rgba_to_n32_premul; |
| + proc = &swizzle_bgra_to_n32_unpremul; |
| + fastProc = &fast_swizzle_bgra_to_n32_unpremul; |
| } |
| } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kCMYK: |
| + case SkEncodedInfo::kInvertedCMYK_Color: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| proc = &swizzle_cmyk_to_n32; |
| @@ -866,27 +879,28 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| proc = &swizzle_cmyk_to_565; |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| break; |
| - case kNoOp8: |
| - proc = &sample1; |
| - fastProc = © |
| - break; |
| - case kNoOp16: |
| - proc = sample2; |
| - fastProc = © |
| - break; |
| - case kNoOp32: |
| - proc = &sample4; |
| - fastProc = © |
| + case SkEncodedInfo::kUnknown_Color: |
| + // Use kUnknown to indicate that we don't need to swizzle. The |
| + // encoded format already matches the output format. |
| + switch (dstInfo.colorType()) { |
| + case kRGB_565_SkColorType: |
| + proc = &sample2; |
| + fastProc = © |
| + break; |
| + default: |
| + return nullptr; |
| + } |
| break; |
| default: |
| - break; |
| + return nullptr; |
| } |
| // Store bpp in bytes if it is an even multiple, otherwise use bits |
| - int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel(sc); |
| + uint8_t bitsPerPixel = encodedInfo.bitsPerPixel(); |
| + int srcBPP = SkIsAlign8(bitsPerPixel) ? bitsPerPixel / 8 : bitsPerPixel; |
| int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType()); |
| int srcOffset = 0; |