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; |
} |