diff options
Diffstat (limited to 'src/gpu/glsl/GrGLSLBlend.cpp')
-rw-r--r-- | src/gpu/glsl/GrGLSLBlend.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/src/gpu/glsl/GrGLSLBlend.cpp b/src/gpu/glsl/GrGLSLBlend.cpp index e9a9f50f84..2f41c4e588 100644 --- a/src/gpu/glsl/GrGLSLBlend.cpp +++ b/src/gpu/glsl/GrGLSLBlend.cpp @@ -422,7 +422,13 @@ void GrGLSLBlend::AppendMode(GrGLSLFragmentBuilder* fsBuilder, const char* srcCo SkXfermode::Coeff srcCoeff, dstCoeff; if (SkXfermode::ModeAsCoeff(mode, &srcCoeff, &dstCoeff)) { + // The only coeff mode that can go out of range is plus. + bool clamp = mode == SkBlendMode::kPlus; + fsBuilder->codeAppendf("%s = ", outColor); + if (clamp) { + fsBuilder->codeAppend("clamp("); + } // append src blend bool didAppend = append_porterduff_term(fsBuilder, srcCoeff, srcColor, srcColor, dstColor, false); @@ -430,6 +436,9 @@ void GrGLSLBlend::AppendMode(GrGLSLFragmentBuilder* fsBuilder, const char* srcCo if(!append_porterduff_term(fsBuilder, dstCoeff, dstColor, srcColor, dstColor, didAppend)) { fsBuilder->codeAppend("vec4(0, 0, 0, 0)"); } + if (clamp) { + fsBuilder->codeAppend(", 0, 1);"); + } fsBuilder->codeAppend(";"); } else { emit_advanced_xfermode_code(fsBuilder, srcColor, dstColor, outColor, mode); |