aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkSwizzler.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-01-17 12:22:48 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-18 15:56:34 +0000
commit7a090c403da1dad6a2e19f2011158bd894a62d91 (patch)
tree8ab2f90ee290754b3bd8d6eea9881df4fb3e79c8 /src/codec/SkSwizzler.cpp
parent98cf99b3ae4cc956158d1fd843fc8a84059ae132 (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.cpp59
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 = &copy;
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 = &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 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 +869,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;
}