Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(48)

Unified Diff: src/codec/SkSwizzler.cpp

Issue 1563393002: Use SkOpts routines in SkSwizzler (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698