diff options
author | msarett <msarett@google.com> | 2016-01-12 06:51:11 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-12 06:51:11 -0800 |
commit | a51e7782b2e028a38712a159c412e6151eca1666 (patch) | |
tree | 674aa08f48b3a98a8baaa55309362ac4cba02e10 /src/codec/SkSwizzler.cpp | |
parent | 086cee12deaf9a9f46bbd2e52173e0e4fc4df311 (diff) |
Use SkOpts routines in SkSwizzler
This is a bit tricky because we don't intend to support sampling
in SkOpts. The swizzler will fallback to a default routine in
the event that sampling is requested.
BUG=skia:4767
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1563393002
Review URL: https://codereview.chromium.org/1563393002
Diffstat (limited to 'src/codec/SkSwizzler.cpp')
-rw-r--r-- | src/codec/SkSwizzler.cpp | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp index c9bdb50d10..74d6c7f87f 100644 --- a/src/codec/SkSwizzler.cpp +++ b/src/codec/SkSwizzler.cpp @@ -7,6 +7,7 @@ #include "SkCodecPriv.h" #include "SkColorPriv.h" +#include "SkOpts.h" #include "SkSwizzler.h" #include "SkTemplates.h" @@ -367,7 +368,6 @@ static void swizzle_rgbx_to_565( } } - // kRGBA static void swizzle_rgba_to_n32_premul( void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, @@ -382,6 +382,21 @@ static void swizzle_rgba_to_n32_premul( } } +static void fast_swizzle_rgba_to_n32_premul( + void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, + int offset, const SkPMColor ctable[]) { + + // This function must not be called if we are sampling. If we are not + // sampling, deltaSrc should equal bpp. + SkASSERT(deltaSrc == bpp); + +#ifdef SK_PMCOLOR_IS_RGBA + SkOpts::premul_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); +#else + SkOpts::premul_swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); +#endif +} + static void swizzle_rgba_to_n32_unpremul( void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { @@ -503,6 +518,7 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, && nullptr == ctable) { return nullptr; } + RowProc fastProc = nullptr; RowProc proc = nullptr; SkCodec::ZeroInitialized zeroInit = options.fZeroInitialized; switch (sc) { @@ -610,7 +626,6 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, } break; case kRGBX: - // TODO: Support other swizzles. switch (dstInfo.colorType()) { case kN32_SkColorType: proc = &swizzle_rgbx_to_n32; @@ -633,8 +648,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, } else { if (SkCodec::kYes_ZeroInitialized == zeroInit) { proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_premul>; + fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_n32_premul>; } else { proc = &swizzle_rgba_to_n32_premul; + fastProc = &fast_swizzle_rgba_to_n32_premul; } } break; @@ -675,9 +692,6 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, default: break; } - if (nullptr == proc) { - return nullptr; - } // Store bpp in bytes if it is an even multiple, otherwise use bits int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel(sc); @@ -699,12 +713,14 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, srcWidth = frame->width(); } - return new SkSwizzler(proc, ctable, srcOffset, srcWidth, dstOffset, dstWidth, srcBPP, dstBPP); + return new SkSwizzler(fastProc, proc, ctable, srcOffset, srcWidth, dstOffset, dstWidth, + srcBPP, dstBPP); } -SkSwizzler::SkSwizzler(RowProc proc, const SkPMColor* ctable, int srcOffset, int srcWidth, - int dstOffset, int dstWidth, int srcBPP, int dstBPP) - : fRowProc(proc) +SkSwizzler::SkSwizzler(RowProc fastProc, RowProc proc, const SkPMColor* ctable, int srcOffset, + int srcWidth, int dstOffset, int dstWidth, int srcBPP, int dstBPP) + : fFastProc(fastProc) + , fProc(proc) , fColorTable(ctable) , fSrcOffset(srcOffset) , fDstOffset(dstOffset) @@ -728,11 +744,15 @@ int SkSwizzler::onSetSampleX(int sampleX) { fSwizzleWidth = get_scaled_dimension(fSrcWidth, sampleX); fAllocatedWidth = get_scaled_dimension(fDstWidth, sampleX); + // The optimized swizzler routines do not (yet) support sampling. + fFastProc = nullptr; + return fAllocatedWidth; } void SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRICT src) { SkASSERT(nullptr != dst && nullptr != src); - fRowProc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fSrcBPP, + RowProc proc = fFastProc ? fFastProc : fProc; + proc(SkTAddOffset<void>(dst, fDstOffsetBytes), src, fSwizzleWidth, fSrcBPP, fSampleX * fSrcBPP, fSrcOffsetUnits, fColorTable); } |