aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/effects
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-07-10 17:43:15 +0000
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-10 17:43:20 +0000
commit62ae664e7491f77e1746a42418661c20c256c26d (patch)
treec842c17f333d51c93686653ac7834b01b11d9c38 /src/gpu/effects
parenta252c661d686393207b133cccbc6211620bf7772 (diff)
Revert "don't compose with (forced) opaque colors"
This reverts commit 81995592d8a941fcf79ba5cee71a37510fa8d6e5. Reason for revert: Various bots reporting "Processor ComposeTwo claimed output for const input doesn't match actual output" Original change's description: > don't compose with (forced) opaque colors > > Bug: skia: > Change-Id: Ic5ea706430b4698e7e937a0cc424ec29b0d8da10 > Reviewed-on: https://skia-review.googlesource.com/22029 > Reviewed-by: Brian Salomon <bsalomon@google.com> > Commit-Queue: Mike Reed <reed@google.com> TBR=bsalomon@google.com,brianosman@google.com,reed@google.com Change-Id: Idf0e0db6e2d81dd00fa39c4ea0b3bcd92af8cae0 No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: skia: Reviewed-on: https://skia-review.googlesource.com/22067 Reviewed-by: Ethan Nicholas <ethannicholas@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/gpu/effects')
-rw-r--r--src/gpu/effects/GrXfermodeFragmentProcessor.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
index ad0427174f..94491c976e 100644
--- a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
+++ b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp
@@ -146,12 +146,14 @@ private:
}
GrColor4f constantOutputForConstantInput(GrColor4f input) const override {
+ float alpha = input.fRGBA[3];
+ input = input.opaque();
GrColor4f srcColor = ConstantOutputForConstantInput(this->childProcessor(0), input);
GrColor4f dstColor = ConstantOutputForConstantInput(this->childProcessor(1), input);
SkPM4f src = GrColor4fToSkPM4f(srcColor);
SkPM4f dst = GrColor4fToSkPM4f(dstColor);
SkPM4f res = SkBlendMode_Apply(fMode, src, dst);
- return SkPM4fToGrColor4f(res);
+ return SkPM4fToGrColor4f(res).mulByScalar(alpha);
}
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
@@ -203,12 +205,18 @@ void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) {
GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
const ComposeTwoFragmentProcessor& cs = args.fFp.cast<ComposeTwoFragmentProcessor>();
+ const char* inputColor = nullptr;
+ if (args.fInputColor) {
+ inputColor = "inputColor";
+ fragBuilder->codeAppendf("vec4 inputColor = vec4(%s.rgb, 1.0);", args.fInputColor);
+ }
+
// declare outputColor and emit the code for each of the two children
SkString srcColor("xfer_src");
- this->emitChild(0, args.fInputColor, &srcColor, args);
+ this->emitChild(0, inputColor, &srcColor, args);
SkString dstColor("xfer_dst");
- this->emitChild(1, args.fInputColor, &dstColor, args);
+ this->emitChild(1, inputColor, &dstColor, args);
// emit blend code
SkBlendMode mode = cs.getMode();
@@ -218,6 +226,11 @@ void GLComposeTwoFragmentProcessor::emitCode(EmitArgs& args) {
dstColor.c_str(),
args.fOutputColor,
mode);
+
+ // re-multiply the output color by the input color's alpha
+ if (args.fInputColor) {
+ fragBuilder->codeAppendf("%s *= %s.a;", args.fOutputColor, args.fInputColor);
+ }
}
sk_sp<GrFragmentProcessor> GrXfermodeFragmentProcessor::MakeFromTwoProcessors(