diff options
author | Matt Sarett <msarett@google.com> | 2017-01-12 18:34:29 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-13 00:12:49 +0000 |
commit | 379938e47bc9edb6edfd21aabefa01aed71dd135 (patch) | |
tree | e67f6678b06f849e4ceb16844a4c00819e0d15a8 /src/codec/SkSwizzler.cpp | |
parent | ac42aebb7b49ef3d916da1e5a75b4c7cd4cfb119 (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.cpp | 28 |
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 = © 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; |