aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2016-11-29 12:57:22 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2016-11-29 18:48:50 +0000
commitf7657e9a2a2be2c892ece03fd65d0f85f033bc6d (patch)
treef899564cb4c9ecc89718a259d3e623aedb3e4b6c /src
parentd1042662413b61f138e621b60818e41b5d916bde (diff)
gather_i8
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD Change-Id: Ia7a133f515e29e16700aabc0633c77a703425f41 Reviewed-on: https://skia-review.googlesource.com/5239 Reviewed-by: Herb Derby <herb@google.com> Commit-Queue: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src')
-rw-r--r--src/image/SkImageShader.cpp18
-rw-r--r--src/image/SkImageShaderContext.h19
-rw-r--r--src/opts/SkRasterPipeline_opts.h9
3 files changed, 30 insertions, 16 deletions
diff --git a/src/image/SkImageShader.cpp b/src/image/SkImageShader.cpp
index 134cc1cd67..3def5ec345 100644
--- a/src/image/SkImageShader.cpp
+++ b/src/image/SkImageShader.cpp
@@ -289,7 +289,6 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dst, SkFal
// TODO: all formats
switch (info.colorType()) {
case kAlpha_8_SkColorType:
- case kIndex_8_SkColorType:
return false;
default: break;
}
@@ -319,11 +318,11 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dst, SkFal
}
auto ctx = scratch->make<SkImageShaderContext>();
-
- ctx->pixels = pm.addr();
- ctx->stride = pm.rowBytesAsPixels();
- ctx->width = pm.width();
- ctx->height = pm.height();
+ ctx->pixels = pm.addr();
+ ctx->ctable = pm.ctable();
+ ctx->stride = pm.rowBytesAsPixels();
+ ctx->width = pm.width();
+ ctx->height = pm.height();
if (matrix.asAffine(ctx->matrix)) {
p->append(SkRasterPipeline::matrix_2x3, ctx->matrix);
} else {
@@ -343,6 +342,7 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dst, SkFal
case kRepeat_TileMode: p->append(SkRasterPipeline::repeat_y, &ctx->height); break;
}
switch (info.colorType()) {
+ case kIndex_8_SkColorType: p->append(SkRasterPipeline::gather_i8, ctx); break;
case kGray_8_SkColorType: p->append(SkRasterPipeline::gather_g8, ctx); break;
case kRGB_565_SkColorType: p->append(SkRasterPipeline::gather_565, ctx); break;
case kARGB_4444_SkColorType: p->append(SkRasterPipeline::gather_4444, ctx); break;
@@ -379,7 +379,11 @@ bool SkImageShader::onAppendStages(SkRasterPipeline* p, SkColorSpace* dst, SkFal
p->append(SkRasterPipeline::move_dst_src);
}
- if (info.colorType() == kBGRA_8888_SkColorType) {
+ auto effective_color_type = [](SkColorType ct) {
+ return ct == kIndex_8_SkColorType ? kN32_SkColorType : ct;
+ };
+
+ if (effective_color_type(info.colorType()) == kBGRA_8888_SkColorType) {
p->append(SkRasterPipeline::swap_rb);
}
if (info.alphaType() == kUnpremul_SkAlphaType) {
diff --git a/src/image/SkImageShaderContext.h b/src/image/SkImageShaderContext.h
index 96b30b0a26..cb562369a9 100644
--- a/src/image/SkImageShaderContext.h
+++ b/src/image/SkImageShaderContext.h
@@ -8,18 +8,21 @@
#ifndef SkImageShaderContext_DEFINED
#define SkImageShaderContext_DEFINED
+class SkColorTable;
+
// Definition used by SkImageShader.cpp and SkRasterPipeline_opts.h.
// Otherwise, completely uninteresting.
struct SkImageShaderContext {
- const void* pixels;
- int stride;
- int width;
- int height;
- float matrix[9];
- float x[8];
- float y[8];
- float scale[8];
+ const void* pixels;
+ SkColorTable* ctable;
+ int stride;
+ int width;
+ int height;
+ float matrix[9];
+ float x[8];
+ float y[8];
+ float scale[8];
};
#endif//SkImageShaderContext_DEFINED
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h
index 11447bcdf9..d38e0ca80d 100644
--- a/src/opts/SkRasterPipeline_opts.h
+++ b/src/opts/SkRasterPipeline_opts.h
@@ -768,7 +768,14 @@ SI SkNi offset_and_ptr(T** ptr, const void* ctx, const SkNf& x, const SkNf& y) {
}
STAGE(gather_a8) {} // TODO
-STAGE(gather_i8) {} // TODO
+STAGE(gather_i8) {
+ auto sc = (const SkImageShaderContext*)ctx;
+ const uint8_t* p;
+ SkNi offset = offset_and_ptr(&p, sc, r, g);
+
+ SkNi ix = SkNx_cast<int>(gather(tail, p, offset));
+ from_8888(gather(tail, sc->ctable->readColors(), ix), &r, &g, &b, &a);
+}
STAGE(gather_g8) {
const uint8_t* p;
SkNi offset = offset_and_ptr(&p, ctx, r, g);