aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkModeColorFilter.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-05-05 12:38:00 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-05 17:06:35 +0000
commit2fbd016820598ba7b617f0f5788d81ec55ccc15a (patch)
tree0d2427707a295d6bbe746618bc901928dfe2807a /src/core/SkModeColorFilter.cpp
parentc367d03fb04fccdc63b1379cf74ddc1cab842039 (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.cpp20
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);
}