Skip to content

Commit 7e2dea5

Browse files
Mike KleinSkia Commit-Bot
authored andcommitted
SkColorFilter::onProgram()
Before we write too many of these, let's get a program() / onProgram() wrapper in place for SkColorFilter. When a filter claims it doesn't change alpha, we can skip any work it might do to "calculate" that unchanged alpha (e.g. 0*r + 0*g + 0*b + 1*a + 0) and instead just save and restore the orignal alpha. SkShader already has this same program() / onProgram() setup, and uses it similarly to force any shader that claims to be opaque to be opaque, replacing any math (or sometimes even memory loads) that shader may have done to produce alpha with a simple splat(1.0f). Change-Id: Ica916926506df3a48b4d718545ea64dd95b457af Reviewed-on: https://skia-review.googlesource.com/c/skia/+/261134 Reviewed-by: Mike Reed <reed@google.com> Commit-Queue: Mike Klein <mtklein@google.com>
1 parent 87e9ddb commit 7e2dea5

4 files changed

Lines changed: 32 additions & 13 deletions

File tree

include/core/SkColorFilter.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@ class SK_API SkColorFilter : public SkFlattenable {
6161

6262
bool appendStages(const SkStageRec& rec, bool shaderIsOpaque) const;
6363

64-
virtual bool program(skvm::Builder*,
65-
SkColorSpace* dstCS,
66-
skvm::Uniforms* uniforms,
67-
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const;
64+
bool program(skvm::Builder*,
65+
SkColorSpace* dstCS,
66+
skvm::Uniforms* uniforms,
67+
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const;
6868

6969
enum Flags {
7070
/** If set the filter methods will not change the alpha channel of the colors.
@@ -148,6 +148,11 @@ class SK_API SkColorFilter : public SkFlattenable {
148148

149149
virtual bool onAppendStages(const SkStageRec& rec, bool shaderIsOpaque) const = 0;
150150

151+
virtual bool onProgram(skvm::Builder*,
152+
SkColorSpace* dstCS,
153+
skvm::Uniforms* uniforms,
154+
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const;
155+
151156
friend class SkComposeColorFilter;
152157

153158
typedef SkFlattenable INHERITED;

src/core/SkColorFilter.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,24 @@ bool SkColorFilter::appendStages(const SkStageRec& rec, bool shaderIsOpaque) con
4545
return this->onAppendStages(rec, shaderIsOpaque);
4646
}
4747

48-
bool SkColorFilter::program(skvm::Builder*,
48+
bool SkColorFilter::program(skvm::Builder* p,
4949
SkColorSpace* dstCS,
5050
skvm::Uniforms* uniforms,
5151
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
52+
skvm::F32 original = *a;
53+
if (this->onProgram(p, dstCS, uniforms, r,g,b,a)) {
54+
if (this->getFlags() & kAlphaUnchanged_Flag) {
55+
*a = original;
56+
}
57+
return true;
58+
}
59+
return false;
60+
}
61+
62+
bool SkColorFilter::onProgram(skvm::Builder*,
63+
SkColorSpace* dstCS,
64+
skvm::Uniforms* uniforms,
65+
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
5266
return false;
5367
}
5468

src/core/SkColorFilter_Matrix.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ bool SkColorFilter_Matrix::onAppendStages(const SkStageRec& rec, bool shaderIsOp
7979
return true;
8080
}
8181

82-
bool SkColorFilter_Matrix::program(skvm::Builder* p,
83-
SkColorSpace* /*dstCS*/,
84-
skvm::Uniforms* uniforms,
85-
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
82+
bool SkColorFilter_Matrix::onProgram(skvm::Builder* p,
83+
SkColorSpace* /*dstCS*/,
84+
skvm::Uniforms* uniforms,
85+
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const {
8686
// TODO: specialize generated code on the 0/1 values of fMatrix?
8787
if (fDomain == Domain::kRGBA) {
8888
// Unpremul.

src/core/SkColorFilter_Matrix.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ class SkColorFilter_Matrix : public SkColorFilter {
3333
SK_FLATTENABLE_HOOKS(SkColorFilter_Matrix)
3434

3535
bool onAppendStages(const SkStageRec& rec, bool shaderIsOpaque) const override;
36-
bool program(skvm::Builder*,
37-
SkColorSpace* dstCS,
38-
skvm::Uniforms* uniforms,
39-
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
36+
bool onProgram(skvm::Builder*,
37+
SkColorSpace* dstCS,
38+
skvm::Uniforms* uniforms,
39+
skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) const override;
4040

4141
float fMatrix[20];
4242
uint16_t fFlags;

0 commit comments

Comments
 (0)