aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkSwizzler.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-01-19 17:42:23 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-20 02:21:25 +0000
commit34c69d63477c8992d3242c02899008810e04af6e (patch)
treeb59dc0c959610b67a5e4ed5f085714a88658edd1 /src/codec/SkSwizzler.cpp
parent1da27ef853ae3e701b7f4aae670c21684396dcce (diff)
Reland "Respect full precision for RGB16 PNGs" (part 3)
This lands the rest of the original CL. It fixes some flawed logic in SkSwizzler handling Gray8 images. Original CL: https://skia-review.googlesource.com/c/7085/ BUG=skia: CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-MSAN,Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD,Build-Ubuntu-Clang-x86_64-Release-Fast Change-Id: Ie2f0c545ea474f1872f284dfb286987b6eadf03d Reviewed-on: https://skia-review.googlesource.com/7320 Reviewed-by: Matt Sarett <msarett@google.com> Commit-Queue: Matt Sarett <msarett@google.com>
Diffstat (limited to 'src/codec/SkSwizzler.cpp')
-rw-r--r--src/codec/SkSwizzler.cpp57
1 files changed, 48 insertions, 9 deletions
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp
index 21c999403e..31fc063aec 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,42 @@ 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:
- proc = &sample1;
- fastProc = &copy;
+ switch (encodedInfo.color()) {
+ case SkEncodedInfo::kGray_Color:
+ 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 = &copy;
+ break;
+ case kRGB_565_SkColorType:
+ proc = &sample2;
+ fastProc = &copy;
+ break;
+ case kRGBA_8888_SkColorType:
+ case kBGRA_8888_SkColorType:
+ proc = &sample4;
+ fastProc = &copy;
+ break;
+ default:
+ return nullptr;
+ }
break;
- case kRGB_565_SkColorType:
- proc = &sample2;
+ case SkEncodedInfo::kInvertedCMYK_Color:
+ case SkEncodedInfo::kYCCK_Color:
+ // We have a jpeg that remains in its original format.
+ srcBPP = 4;
+ proc = &sample4;
fastProc = &copy;
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 +863,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo,
}
fastProc = &copy;
break;
+ case SkEncodedInfo::kRGB_Color:
+ // We have a png that remains in its original format.
+ SkASSERT(16 == encodedInfo.bitsPerComponent());
+ srcBPP = 6;
+ proc = &sample6;
+ fastProc = &copy;
+ break;
default:
return nullptr;
}