aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkModeColorFilter.cpp
diff options
context:
space:
mode:
authorGravatar Mike Klein <mtklein@google.com>2017-06-13 00:41:52 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-13 00:42:04 +0000
commit4049dffaa8392f6cebab3dd0b9f12fd1eaef4ede (patch)
tree105a8362c69d0fc8d2445ded4a59eed571d06fd7 /src/core/SkModeColorFilter.cpp
parentc8b6828d4f172f7b5735dbc5e26a33c53a54e94f (diff)
Revert "inline common modecolorfilters"
This reverts commit c8b6828d4f172f7b5735dbc5e26a33c53a54e94f. Reason for revert: looks like this messed up colorcomposefilter_wacky and colorcomposefilter_alpha. I suspect we're missing a swap_rb or two. Original change's description: > inline common modecolorfilters > > *seems* like we won't trigger layout tests, since chrome only uses Src, SrcIn and Modulate. > Bug: skia: > Change-Id: Ieae7e85bd3f2d23278b0405c2a5d64dbad1e0739 > Reviewed-on: https://skia-review.googlesource.com/19551 > Reviewed-by: Mike Klein <mtklein@chromium.org> > Commit-Queue: Mike Klein <mtklein@chromium.org> TBR=mtklein@chromium.org,mtklein@google.com,reed@google.com No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Change-Id: I7fc28e0f1e65c69be328ade32fbef078dbe99402 Reviewed-on: https://skia-review.googlesource.com/19555 Reviewed-by: Mike Klein <mtklein@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/core/SkModeColorFilter.cpp')
-rw-r--r--src/core/SkModeColorFilter.cpp67
1 files changed, 38 insertions, 29 deletions
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp
index 270cb811a3..7e93747f10 100644
--- a/src/core/SkModeColorFilter.cpp
+++ b/src/core/SkModeColorFilter.cpp
@@ -63,35 +63,11 @@ uint32_t SkModeColorFilter::getFlags() const {
}
void SkModeColorFilter::filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const {
- SkPMColor color = fPMColor;
+ SkPMColor color = fPMColor;
+ SkXfermodeProc proc = SkXfermode::GetProc(fMode);
- switch (fMode) {
- case SkBlendMode::kSrc:
- sk_memset32(result, color, count);
- break;
- case SkBlendMode::kSrcIn:
- for (int i = 0; i < count; ++i) {
- result[i] = SkAlphaMulQ(color, SkAlpha255To256(SkGetPackedA32(shader[i])));
- }
- break;
- case SkBlendMode::kModulate:
- for (int i = 0; i < count; ++i) {
- int a = SkMulDiv255Round(SkGetPackedA32(color), SkGetPackedA32(shader[i]));
- int r = SkMulDiv255Round(SkGetPackedR32(color), SkGetPackedR32(shader[i]));
- int g = SkMulDiv255Round(SkGetPackedG32(color), SkGetPackedG32(shader[i]));
- int b = SkMulDiv255Round(SkGetPackedB32(color), SkGetPackedB32(shader[i]));
- result[i] = SkPackARGB32(a, r, g, b);
- }
- break;
- default: {
- SkSTArenaAlloc<256> alloc;
- SkRasterPipeline p(&alloc);
-
- p.append(SkRasterPipeline::load_8888, &shader);
- this->appendStages(&p, nullptr, &alloc, false);
- p.append(SkRasterPipeline::store_8888, &result);
- p.run(0, 0, count);
- } break;
+ for (int i = 0; i < count; i++) {
+ result[i] = proc(color, shader[i]);
}
}
@@ -156,6 +132,32 @@ sk_sp<GrFragmentProcessor> SkModeColorFilter::asFragmentProcessor(
///////////////////////////////////////////////////////////////////////////////
+class Src_SkModeColorFilter final : public SkModeColorFilter {
+public:
+ Src_SkModeColorFilter(SkColor color) : INHERITED(color, SkBlendMode::kSrc) {}
+
+ void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override {
+ sk_memset32(result, this->getPMColor(), count);
+ }
+
+private:
+ typedef SkModeColorFilter INHERITED;
+};
+
+class SrcOver_SkModeColorFilter final : public SkModeColorFilter {
+public:
+ SrcOver_SkModeColorFilter(SkColor color) : INHERITED(color, SkBlendMode::kSrcOver) { }
+
+ void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const override {
+ SkBlitRow::Color32(result, shader, count, this->getPMColor());
+ }
+
+private:
+ typedef SkModeColorFilter INHERITED;
+};
+
+///////////////////////////////////////////////////////////////////////////////
+
sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mode) {
if (!SkIsValidMode(mode)) {
return nullptr;
@@ -189,5 +191,12 @@ sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mo
return nullptr;
}
- return SkModeColorFilter::Make(color, mode);
+ switch (mode) {
+ case SkBlendMode::kSrc:
+ return sk_make_sp<Src_SkModeColorFilter>(color);
+ case SkBlendMode::kSrcOver:
+ return sk_make_sp<SrcOver_SkModeColorFilter>(color);
+ default:
+ return SkModeColorFilter::Make(color, mode);
+ }
}