diff options
author | Matt Sarett <msarett@google.com> | 2017-01-17 12:22:48 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-18 15:56:34 +0000 |
commit | 7a090c403da1dad6a2e19f2011158bd894a62d91 (patch) | |
tree | 8ab2f90ee290754b3bd8d6eea9881df4fb3e79c8 /src/codec/SkSwizzler.cpp | |
parent | 98cf99b3ae4cc956158d1fd843fc8a84059ae132 (diff) |
Respect full precision for RGB16 PNGs
BUG=skia:
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
Change-Id: If58d201daae97bce2f8efbc453c2ec452e682493
Reviewed-on: https://skia-review.googlesource.com/7085
Commit-Queue: Matt Sarett <msarett@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Reviewed-by: Leon Scroggins <scroggo@google.com>
Reviewed-by: Mike Reed <reed@google.com>
Diffstat (limited to 'src/codec/SkSwizzler.cpp')
-rw-r--r-- | src/codec/SkSwizzler.cpp | 59 |
1 files changed, 52 insertions, 7 deletions
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp index 21c999403e..820072f9f0 100644 --- a/src/codec/SkSwizzler.cpp +++ b/src/codec/SkSwizzler.cpp @@ -51,6 +51,17 @@ static void sample4(void* dst, const uint8_t* src, int width, int bpp, int delta } } +static void sample6(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, + const SkPMColor ctable[]) { + src += offset; + uint8_t* dst8 = (uint8_t*) dst; + for (int x = 0; x < width; x++) { + memcpy(dst8, src, 6); + dst8 += 6; + src += deltaSrc; + } +} + static void sample8(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { src += offset; @@ -809,21 +820,48 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, int srcBPP; const int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType()); if (skipFormatConversion) { - srcBPP = dstBPP; - switch (dstInfo.colorType()) { - case kGray_8_SkColorType: + switch (encodedInfo.color()) { + case SkEncodedInfo::kGray_Color: + case SkEncodedInfo::kPalette_Color: + // The encoded format and the dstColorType are the same. + srcBPP = 1; proc = &sample1; fastProc = © break; - case kRGB_565_SkColorType: - proc = &sample2; + case SkEncodedInfo::kYUV_Color: + // We have a jpeg that has already been converted to the dstColorType. + srcBPP = dstBPP; + switch (dstInfo.colorType()) { + case kGray_8_SkColorType: + proc = &sample1; + fastProc = © + break; + case kRGB_565_SkColorType: + proc = &sample2; + fastProc = © + break; + case kRGBA_8888_SkColorType: + case kBGRA_8888_SkColorType: + proc = &sample4; + fastProc = © + break; + default: + return nullptr; + } + break; + case SkEncodedInfo::kInvertedCMYK_Color: + case SkEncodedInfo::kYCCK_Color: + // We have a jpeg that remains in its original format. + srcBPP = 4; + proc = &sample4; fastProc = © break; - case kRGBA_8888_SkColorType: - case kBGRA_8888_SkColorType: + case SkEncodedInfo::kRGBA_Color: + // We have a png that should remain in its original format. SkASSERT(16 == encodedInfo.bitsPerComponent() || 8 == encodedInfo.bitsPerComponent()); if (8 == encodedInfo.bitsPerComponent()) { + srcBPP = 4; proc = &sample4; } else { srcBPP = 8; @@ -831,6 +869,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, } fastProc = © break; + case SkEncodedInfo::kRGB_Color: + // We have a png that remains in its original format. + SkASSERT(16 == encodedInfo.bitsPerComponent()); + srcBPP = 6; + proc = &sample6; + fastProc = © + break; default: return nullptr; } |