aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@chromium.org>2017-05-31 16:27:14 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-01 14:55:10 +0000
commitc6912f712f3423b2a09a6e96c999b65a1fd86062 (patch)
treed86b5c609bcf45cee1dacd07e7430f5d1b13fa7e
parentfe50d9696a95717b994528cdfb99e433348c5ef3 (diff)
make SkColorFilter::onAppendStages() pure
Change-Id: I2851e19648fb0478db9b940e86c6ddb2020000b3 Reviewed-on: https://skia-review.googlesource.com/18264 Commit-Queue: Mike Reed <reed@google.com> Reviewed-by: Mike Reed <reed@google.com>
-rw-r--r--include/core/SkColorFilter.h7
-rw-r--r--src/core/SkColorFilter.cpp18
-rw-r--r--src/effects/SkOverdrawColorFilter.cpp31
-rw-r--r--src/effects/SkOverdrawColorFilter.h2
-rw-r--r--tools/sk_tool_utils.cpp3
5 files changed, 29 insertions, 32 deletions
diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h
index 1c320ba30f..75401627fd 100644
--- a/include/core/SkColorFilter.h
+++ b/include/core/SkColorFilter.h
@@ -184,12 +184,7 @@ private:
}
virtual void onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
- bool shaderIsOpaque) const;
-
-
- virtual void onFilterStage(const SkPM4f[], int, SkPM4f[]) const {
- SkASSERT(false);
- }
+ bool shaderIsOpaque) const = 0;
friend class SkColorSpaceXformer;
friend class SkComposeColorFilter;
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 9304c7c803..65b5c45308 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -48,24 +48,6 @@ void SkColorFilter::appendStages(SkRasterPipeline* p,
this->onAppendStages(p, dstCS, alloc, shaderIsOpaque);
}
-void SkColorFilter::onAppendStages(SkRasterPipeline* p,
- SkColorSpace* dstCS,
- SkArenaAlloc* alloc,
- bool) const {
- struct Ctx : SkJumper_CallbackCtx {
- sk_sp<SkColorFilter> cf;
- };
- auto ctx = alloc->make<Ctx>();
- ctx->cf = dstCS ? SkColorSpaceXformer::Make(sk_ref_sp(dstCS))->apply(this)
- : sk_ref_sp(const_cast<SkColorFilter*>(this));
- ctx->fn = [](SkJumper_CallbackCtx* arg, int active_pixels) {
- auto ctx = (Ctx*)arg;
- auto buf = (SkPM4f*)ctx->rgba;
- ctx->cf->onFilterStage(buf, active_pixels, buf);
- };
- p->append(SkRasterPipeline::callback, ctx);
-}
-
SkColor SkColorFilter::filterColor(SkColor c) const {
SkPMColor dst, src = SkPreMultiplyColor(c);
this->filterSpan(&src, 1, &dst);
diff --git a/src/effects/SkOverdrawColorFilter.cpp b/src/effects/SkOverdrawColorFilter.cpp
index bbeb028144..a4e13f9935 100644
--- a/src/effects/SkOverdrawColorFilter.cpp
+++ b/src/effects/SkOverdrawColorFilter.cpp
@@ -5,9 +5,12 @@
* found in the LICENSE file.
*/
+#include "SkArenaAlloc.h"
#include "SkOverdrawColorFilter.h"
#include "SkPM4f.h"
+#include "SkRasterPipeline.h"
#include "SkReadBuffer.h"
+#include "../jumper/SkJumper.h"
void SkOverdrawColorFilter::filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const {
for (int x = 0; x < count; x++) {
@@ -20,14 +23,28 @@ void SkOverdrawColorFilter::filterSpan(const SkPMColor src[], int count, SkPMCol
}
}
-void SkOverdrawColorFilter::onFilterStage(const SkPM4f src[], int count, SkPM4f dst[]) const {
- for (int i = 0; i < count; ++i) {
- uint8_t alpha = (int)(src[i].a() * 255);
- if (alpha >= kNumColors) {
- alpha = kNumColors - 1;
+void SkOverdrawColorFilter::onAppendStages(SkRasterPipeline* p,
+ SkColorSpace* dstCS,
+ SkArenaAlloc* alloc,
+ bool shader_is_opaque) const {
+ struct Ctx : public SkJumper_CallbackCtx {
+ const SkPMColor* colors;
+ };
+ // TODO: do we care about transforming to dstCS?
+ auto ctx = alloc->make<Ctx>();
+ ctx->colors = fColors;
+ ctx->fn = [](SkJumper_CallbackCtx* arg, int active_pixels) {
+ auto ctx = (Ctx*)arg;
+ auto pixels = (SkPM4f*)ctx->rgba;
+ for (int i = 0; i < active_pixels; i++) {
+ uint8_t alpha = (int)(pixels[i].a() * 255);
+ if (alpha >= kNumColors) {
+ alpha = kNumColors - 1;
+ }
+ pixels[i] = SkPM4f::FromPMColor(ctx->colors[alpha]);
}
- dst[i] = SkPM4f::FromPMColor(fColors[alpha]);
- }
+ };
+ p->append(SkRasterPipeline::callback, ctx);
}
void SkOverdrawColorFilter::toString(SkString* str) const {
diff --git a/src/effects/SkOverdrawColorFilter.h b/src/effects/SkOverdrawColorFilter.h
index 09c5173bf6..41d7988577 100644
--- a/src/effects/SkOverdrawColorFilter.h
+++ b/src/effects/SkOverdrawColorFilter.h
@@ -46,7 +46,7 @@ private:
memcpy(fColors, colors, kNumColors * sizeof(SkPMColor));
}
- void onFilterStage(const SkPM4f src[], int count, SkPM4f result[]) const override;
+ void onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, bool) const override;
SkPMColor fColors[kNumColors];
diff --git a/tools/sk_tool_utils.cpp b/tools/sk_tool_utils.cpp
index 95f4cb1a6e..c792c48475 100644
--- a/tools/sk_tool_utils.cpp
+++ b/tools/sk_tool_utils.cpp
@@ -40,6 +40,9 @@ public:
void filterSpan(const SkPMColor src[], int count, SkPMColor dst[]) const override {
SK_ABORT("SkSRGBColorFilter is only implemented for GPU");
}
+ void onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*, bool) const override {
+ SK_ABORT("SkSRGBColorFilter is only implemented for GPU");
+ }
Factory getFactory() const override { return nullptr; }
#ifndef SK_IGNORE_TO_STRING