Chromium Code Reviews| Index: src/codec/SkSwizzler.cpp |
| diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp |
| index d783380294ab81f18a5c67e2d66bf8e5a33db2d4..42f09591a4f81a4065e057a101fc4de16b408ebf 100644 |
| --- a/src/codec/SkSwizzler.cpp |
| +++ b/src/codec/SkSwizzler.cpp |
| @@ -8,6 +8,7 @@ |
| #include "SkCodecPriv.h" |
| #include "SkColorPriv.h" |
| #include "SkSwizzler.h" |
| +#include "SkSwizzlerOpts.h" |
| #include "SkTemplates.h" |
| SkSwizzler::ResultAlpha SkSwizzler::GetResult(uint8_t zeroAlpha, |
| @@ -428,7 +429,6 @@ static SkSwizzler::ResultAlpha swizzle_rgbx_to_565( |
| return SkSwizzler::kOpaque_ResultAlpha; |
| } |
| - |
| // kRGBA |
| static SkSwizzler::ResultAlpha swizzle_rgba_to_n32_premul( |
| void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
| @@ -603,22 +603,23 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| && nullptr == ctable) { |
| return nullptr; |
| } |
| - RowProc proc = nullptr; |
| + RowProc optProc = nullptr; |
| + RowProc scalarProc = nullptr; |
| SkCodec::ZeroInitialized zeroInit = options.fZeroInitialized; |
| switch (sc) { |
| case kBit: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_bit_to_n32; |
| + optProc = &swizzle_bit_to_n32; |
| break; |
| case kIndex_8_SkColorType: |
| - proc = &swizzle_bit_to_index; |
| + optProc = &swizzle_bit_to_index; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_bit_to_565; |
| + optProc = &swizzle_bit_to_565; |
| break; |
| case kGray_8_SkColorType: |
| - proc = &swizzle_bit_to_grayscale; |
| + optProc = &swizzle_bit_to_grayscale; |
| break; |
| default: |
| break; |
| @@ -629,13 +630,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kIndex4: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_small_index_to_n32; |
| + optProc = &swizzle_small_index_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_small_index_to_565; |
| + optProc = &swizzle_small_index_to_565; |
| break; |
| case kIndex_8_SkColorType: |
| - proc = &swizzle_small_index_to_index; |
| + optProc = &swizzle_small_index_to_index; |
| break; |
| default: |
| break; |
| @@ -646,18 +647,18 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kN32_SkColorType: |
| // We assume the color premultiplied ctable (or not) as desired. |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &swizzle_index_to_n32_skipZ; |
| + optProc = &swizzle_index_to_n32_skipZ; |
| break; |
| } else { |
| - proc = &swizzle_index_to_n32; |
| + optProc = &swizzle_index_to_n32; |
| break; |
| } |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_index_to_565; |
| + optProc = &swizzle_index_to_565; |
| break; |
| case kIndex_8_SkColorType: |
| - proc = &swizzle_index_to_index; |
| + optProc = &swizzle_index_to_index; |
| break; |
| default: |
| break; |
| @@ -666,13 +667,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kGray: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_gray_to_n32; |
| + optProc = &swizzle_gray_to_n32; |
| break; |
| case kGray_8_SkColorType: |
| - proc = &swizzle_gray_to_gray; |
| + optProc = &swizzle_gray_to_gray; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_gray_to_565; |
| + optProc = &swizzle_gray_to_565; |
| break; |
| default: |
| break; |
| @@ -682,10 +683,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kBGRX: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_bgrx_to_n32; |
| + optProc = &swizzle_bgrx_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_bgrx_to_565; |
| + optProc = &swizzle_bgrx_to_565; |
| break; |
| default: |
| break; |
| @@ -696,10 +697,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kN32_SkColorType: |
| switch (dstInfo.alphaType()) { |
| case kUnpremul_SkAlphaType: |
| - proc = &swizzle_bgra_to_n32_unpremul; |
| + optProc = &swizzle_bgra_to_n32_unpremul; |
| break; |
| case kPremul_SkAlphaType: |
| - proc = &swizzle_bgra_to_n32_premul; |
| + optProc = &swizzle_bgra_to_n32_premul; |
| break; |
| default: |
| break; |
| @@ -710,13 +711,12 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| } |
| break; |
| case kRGBX: |
| - // TODO: Support other swizzles. |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_rgbx_to_n32; |
| + optProc = &swizzle_rgbx_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_rgbx_to_565; |
| + optProc = &swizzle_rgbx_to_565; |
| default: |
| break; |
| } |
| @@ -726,12 +726,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kN32_SkColorType: |
| if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
| // Respect zeroInit? |
| - proc = &swizzle_rgba_to_n32_unpremul; |
| + optProc = &swizzle_rgba_to_n32_unpremul; |
| } else { |
| + optProc = &opt_swizzle_rgba_to_n32_premul; |
| if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
| - proc = &swizzle_rgba_to_n32_premul_skipZ; |
| + scalarProc = &swizzle_rgba_to_n32_premul_skipZ; |
|
msarett
2016/01/08 13:56:00
We'll want to benchmark against the regular versio
mtklein
2016/01/08 15:20:19
There's more to this feature than just speed, righ
scroggo
2016/01/08 16:02:56
Yes.
mtklein
2016/01/08 16:23:01
And we're certain there really are runs of >=1024
scroggo
2016/01/08 16:50:51
Yes. (I can dig up the bug, but when the change fi
msarett
2016/01/11 20:33:24
I think Mike's idea to skip leading zeros will be
|
| } else { |
|
mtklein
2016/01/08 15:20:19
If I'm right above about this being more than just
msarett
2016/01/11 20:33:24
Yes we could. I don't think that's a good option
|
| - proc = &swizzle_rgba_to_n32_premul; |
| + scalarProc = &swizzle_rgba_to_n32_premul; |
| } |
| } |
| break; |
| @@ -742,7 +743,7 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kRGB: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_rgbx_to_n32; |
| + optProc = &swizzle_rgbx_to_n32; |
| break; |
| default: |
| break; |
| @@ -751,7 +752,7 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kRGB_565: |
| switch (dstInfo.colorType()) { |
| case kRGB_565_SkColorType: |
| - proc = &sample565; |
| + optProc = &sample565; |
| break; |
| default: |
| break; |
| @@ -760,10 +761,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| case kCMYK: |
| switch (dstInfo.colorType()) { |
| case kN32_SkColorType: |
| - proc = &swizzle_cmyk_to_n32; |
| + optProc = &swizzle_cmyk_to_n32; |
| break; |
| case kRGB_565_SkColorType: |
| - proc = &swizzle_cmyk_to_565; |
| + optProc = &swizzle_cmyk_to_565; |
| break; |
| default: |
| break; |
| @@ -772,9 +773,12 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| default: |
| break; |
| } |
| - if (nullptr == proc) { |
| + if (nullptr == optProc) { |
|
scroggo
2016/01/08 16:02:57
So are we guaranteed that there's an optProc, but
mtklein
2016/01/08 16:23:01
(That's what I find confusing. In reality, we're
msarett
2016/01/11 20:33:24
Done.
|
| return nullptr; |
| } |
| + if (nullptr == scalarProc) { |
| + scalarProc = optProc; |
| + } |
| // Store bpp in bytes if it is an even multiple, otherwise use bits |
| int srcBPP = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPixel(sc); |
| @@ -796,12 +800,14 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| srcWidth = frame->width(); |
| } |
| - return new SkSwizzler(proc, ctable, srcOffset, srcWidth, dstOffset, dstWidth, srcBPP, dstBPP); |
| + return new SkSwizzler(optProc, scalarProc, 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 optProc, RowProc scalarProc, const SkPMColor* ctable, int srcOffset, |
| + int srcWidth, int dstOffset, int dstWidth, int srcBPP, int dstBPP) |
| + : fRowProc(optProc) |
| + , fScalarRowProc(scalarProc) |
| , fColorTable(ctable) |
| , fSrcOffset(srcOffset) |
| , fDstOffset(dstOffset) |
| @@ -825,6 +831,9 @@ 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. |
| + fRowProc = fScalarRowProc; |
|
mtklein
2016/01/08 15:20:19
This preference logic might be simpler to follow g
msarett
2016/01/11 20:33:24
Done.
|
| + |
| return fAllocatedWidth; |
| } |