aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkModeColorFilter.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-06-12 21:58:03 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-06-13 02:20:40 +0000
commite8f28818a2c0fe967f9fc4cec4bb9dc78af78212 (patch)
treea9ef6c2bcd256db88443ebd75fa3d69e1c1c114c /src/core/SkModeColorFilter.cpp
parent4049dffaa8392f6cebab3dd0b9f12fd1eaef4ede (diff)
Revert "Revert "inline common modecolorfilters""
inline commone modecolorfilters This reverts commit 4049dffaa8392f6cebab3dd0b9f12fd1eaef4ede. Bug: skia: Change-Id: I8887cc47b2c92da7b6f83548221b7d65958cf01f Reviewed-on: https://skia-review.googlesource.com/19561 Commit-Queue: Mike Reed <reed@google.com> Commit-Queue: Mike Klein <mtklein@google.com> Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'src/core/SkModeColorFilter.cpp')
-rw-r--r--src/core/SkModeColorFilter.cpp73
1 files changed, 35 insertions, 38 deletions
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp
index 7e93747f10..bca23c63bb 100644
--- a/src/core/SkModeColorFilter.cpp
+++ b/src/core/SkModeColorFilter.cpp
@@ -63,11 +63,41 @@ uint32_t SkModeColorFilter::getFlags() const {
}
void SkModeColorFilter::filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const {
- SkPMColor color = fPMColor;
- SkXfermodeProc proc = SkXfermode::GetProc(fMode);
+ SkPMColor color = fPMColor;
- for (int i = 0; i < count; i++) {
- result[i] = proc(color, shader[i]);
+ 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);
+ if (kN32_SkColorType == kBGRA_8888_SkColorType) {
+ p.append(SkRasterPipeline::swap_rb);
+ }
+ this->appendStages(&p, nullptr, &alloc, false);
+ if (kN32_SkColorType == kBGRA_8888_SkColorType) {
+ p.append(SkRasterPipeline::swap_rb);
+ }
+ p.append(SkRasterPipeline::store_8888, &result);
+ p.run(0, 0, count);
+ } break;
}
}
@@ -132,32 +162,6 @@ 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;
@@ -191,12 +195,5 @@ sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mo
return nullptr;
}
- 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);
- }
+ return SkModeColorFilter::Make(color, mode);
}