aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkSwizzler.cpp
diff options
context:
space:
mode:
authorGravatar Matt Sarett <msarett@google.com>2017-01-12 18:34:29 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-01-13 00:12:49 +0000
commit379938e47bc9edb6edfd21aabefa01aed71dd135 (patch)
treee67f6678b06f849e4ceb16844a4c00819e0d15a8 /src/codec/SkSwizzler.cpp
parentac42aebb7b49ef3d916da1e5a75b4c7cd4cfb119 (diff)
Use RasterPipeline to support full precision on 16-bit RGBA pngs
Reland of Original Change: https://skia-review.googlesource.com/6260 CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD Change-Id: I809984dd9af225103bfbe83492a17c19da7c5e40 Reviewed-on: https://skia-review.googlesource.com/6980 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.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp
index 415f0f1ddc..21c999403e 100644
--- a/src/codec/SkSwizzler.cpp
+++ b/src/codec/SkSwizzler.cpp
@@ -51,6 +51,16 @@ static void sample4(void* dst, const uint8_t* src, int width, int bpp, int delta
}
}
+static void sample8(void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset,
+ const SkPMColor ctable[]) {
+ src += offset;
+ uint64_t* dst64 = (uint64_t*) dst;
+ for (int x = 0; x < width; x++) {
+ dst64[x] = *((const uint64_t*) src);
+ src += deltaSrc;
+ }
+}
+
// kBit
// These routines exclusively choose between white and black
@@ -796,7 +806,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo,
RowProc fastProc = nullptr;
RowProc proc = nullptr;
+ int srcBPP;
+ const int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType());
if (skipFormatConversion) {
+ srcBPP = dstBPP;
switch (dstInfo.colorType()) {
case kGray_8_SkColorType:
proc = &sample1;
@@ -808,7 +821,14 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo,
break;
case kRGBA_8888_SkColorType:
case kBGRA_8888_SkColorType:
- proc = &sample4;
+ SkASSERT(16 == encodedInfo.bitsPerComponent() ||
+ 8 == encodedInfo.bitsPerComponent());
+ if (8 == encodedInfo.bitsPerComponent()) {
+ proc = &sample4;
+ } else {
+ srcBPP = 8;
+ proc = &sample8;
+ }
fastProc = &copy;
break;
default:
@@ -1137,13 +1157,7 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo,
default:
return nullptr;
}
- }
- int srcBPP;
- const int dstBPP = SkColorTypeBytesPerPixel(dstInfo.colorType());
- if (skipFormatConversion) {
- srcBPP = dstBPP;
- } else {
// Store bpp in bytes if it is an even multiple, otherwise use bits
uint8_t bitsPerPixel = encodedInfo.bitsPerPixel();
srcBPP = SkIsAlign8(bitsPerPixel) ? bitsPerPixel / 8 : bitsPerPixel;