diff options
author | 2017-02-21 14:19:07 -0500 | |
---|---|---|
committer | 2017-02-21 21:43:29 +0000 | |
commit | e026511f4c4b90bfe842f89966d088b663fc8c13 (patch) | |
tree | f69cb9fa79b65cf491b818f3af7bac3cc09cab35 | |
parent | 709b02534681f8ab8d17f144713f276e10d13385 (diff) |
Fix ComposeOneFragmentProcessor coverage as alpha optimization.
It should only be advertised if the child also advertises it.
Change-Id: I698213c9562d710dff45f0622d50eacc41e29af5
Reviewed-on: https://skia-review.googlesource.com/8811
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
-rw-r--r-- | src/gpu/effects/GrXfermodeFragmentProcessor.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp index 8488fec2ff..eb6f04b075 100644 --- a/src/gpu/effects/GrXfermodeFragmentProcessor.cpp +++ b/src/gpu/effects/GrXfermodeFragmentProcessor.cpp @@ -285,15 +285,21 @@ private: break; // Produces opaque if both src and dst are opaque. These also will modulate the child's - // output by either the input color or alpha. + // output by either the input color or alpha. However, if the child is not compatible + // with the coverage as alpha then it may produce a color that is not valid premul. case SkBlendMode::kSrcIn: case SkBlendMode::kDstIn: case SkBlendMode::kModulate: - if (fp->preservesOpaqueInput()) { - flags = kPreservesOpaqueInput_OptimizationFlag | - kCompatibleWithCoverageAsAlpha_OptimizationFlag; + if (fp->compatibleWithCoverageAsAlpha()) { + if (fp->preservesOpaqueInput()) { + flags = kPreservesOpaqueInput_OptimizationFlag | + kCompatibleWithCoverageAsAlpha_OptimizationFlag; + } else { + flags = kCompatibleWithCoverageAsAlpha_OptimizationFlag; + } } else { - flags = kCompatibleWithCoverageAsAlpha_OptimizationFlag; + flags = fp->preservesOpaqueInput() ? kPreservesOpaqueInput_OptimizationFlag + : kNone_OptimizationFlags; } break; |