diff options
author | Mike Reed <reed@google.com> | 2017-05-05 12:38:00 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-05-05 17:06:35 +0000 |
commit | 2fbd016820598ba7b617f0f5788d81ec55ccc15a (patch) | |
tree | 0d2427707a295d6bbe746618bc901928dfe2807a /src/core/SkModeColorFilter.cpp | |
parent | c367d03fb04fccdc63b1379cf74ddc1cab842039 (diff) |
speed-up 4f version of modecolorfilter and modulate
~20% faster
1. Don't call color4f::premul on every invocation
2. Inline modulate as its own special case (used by shadows)
Bug: skia:
Change-Id: I49ca565f589b9a7caac88e95468da7f8c395804a
Reviewed-on: https://skia-review.googlesource.com/15613
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core/SkModeColorFilter.cpp')
-rw-r--r-- | src/core/SkModeColorFilter.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp index 7978f939f5..a5ec5e08ac 100644 --- a/src/core/SkModeColorFilter.cpp +++ b/src/core/SkModeColorFilter.cpp @@ -66,7 +66,7 @@ void SkModeColorFilter::filterSpan(const SkPMColor shader[], int count, SkPMColo void SkModeColorFilter::filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const { SkXfermodeProc4f proc = SkXfermode::GetProc4f(fMode); - auto pm4f = SkColor4f::FromColor(fColor).premul(); + auto pm4f = fPMColor4f; for (int i = 0; i < count; i++) { result[i] = proc(pm4f, shader[i]); } @@ -80,6 +80,7 @@ void SkModeColorFilter::flatten(SkWriteBuffer& buffer) const { void SkModeColorFilter::updateCache() { fPMColor = SkPreMultiplyColor(fColor); fProc = SkXfermode::GetProc(fMode); + fPMColor4f = SkColor4f::FromColor(fColor).premul(); } sk_sp<SkFlattenable> SkModeColorFilter::CreateProc(SkReadBuffer& buffer) { @@ -167,6 +168,21 @@ private: typedef SkModeColorFilter INHERITED; }; +class Modulate_SkModeColorFilter final : public SkModeColorFilter { +public: + Modulate_SkModeColorFilter(SkColor color) : INHERITED(color, SkBlendMode::kModulate) { } + + void filterSpan4f(const SkPM4f shader[], int count, SkPM4f result[]) const override { + auto pm4f = fPMColor4f.to4f(); + for (int i = 0; i < count; i++) { + (pm4f * shader[i].to4f()).store(result[i].fVec); + } + } + +private: + typedef SkModeColorFilter INHERITED; +}; + /////////////////////////////////////////////////////////////////////////////// sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mode) { @@ -207,6 +223,8 @@ sk_sp<SkColorFilter> SkColorFilter::MakeModeFilter(SkColor color, SkBlendMode mo return sk_make_sp<Src_SkModeColorFilter>(color); case SkBlendMode::kSrcOver: return sk_make_sp<SrcOver_SkModeColorFilter>(color); + case SkBlendMode::kModulate: + return sk_make_sp<Modulate_SkModeColorFilter>(color); default: return SkModeColorFilter::Make(color, mode); } |