diff options
author | Mike Reed <reed@google.com> | 2017-06-12 21:58:03 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-06-13 02:20:40 +0000 |
commit | e8f28818a2c0fe967f9fc4cec4bb9dc78af78212 (patch) | |
tree | a9ef6c2bcd256db88443ebd75fa3d69e1c1c114c /src/core/SkModeColorFilter.cpp | |
parent | 4049dffaa8392f6cebab3dd0b9f12fd1eaef4ede (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.cpp | 73 |
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); } |