| Index: src/effects/SkArithmeticMode.cpp
|
| diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp
|
| index fff03c291fb27550a44ead6dae5164deabbd3bcc..e47a7ac278467d3b91a862302987aaa7b872d569 100644
|
| --- a/src/effects/SkArithmeticMode.cpp
|
| +++ b/src/effects/SkArithmeticMode.cpp
|
| @@ -245,7 +245,7 @@ public:
|
| const GrDrawEffect&,
|
| EffectKey,
|
| const char* outputColor,
|
| - const char* inputColor,
|
| + const GrGLSLExpr4& inputColor,
|
| const TransformedCoordsArray&,
|
| const TextureSamplerArray&) SK_OVERRIDE;
|
|
|
| @@ -344,7 +344,7 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
|
| const GrDrawEffect& drawEffect,
|
| EffectKey key,
|
| const char* outputColor,
|
| - const char* inputColor,
|
| + const GrGLSLExpr4& inputColor,
|
| const TransformedCoordsArray& coords,
|
| const TextureSamplerArray& samplers) {
|
|
|
| @@ -362,24 +362,32 @@ void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder,
|
| SkASSERT(NULL != dstColor);
|
| fKUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| kVec4f_GrSLType, "k");
|
| - const char* kUni = builder->getUniformCStr(fKUni);
|
|
|
| - // We don't try to optimize for this case at all
|
| - if (NULL == inputColor) {
|
| - builder->fsCodeAppendf("\t\tconst vec4 src = vec4(1);\n");
|
| + GrGLSLExpr4 src;
|
| + if (gUseUnpremul) {
|
| + builder->fsCodeAppendf("\t\tvec4 src = %s;\n", inputColor.c_str());
|
| + builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
|
| + src = GrGLSLExpr4("src");
|
| } else {
|
| - builder->fsCodeAppendf("\t\tvec4 src = %s;\n", inputColor);
|
| - if (gUseUnpremul) {
|
| - builder->fsCodeAppendf("\t\tsrc.rgb = clamp(src.rgb / src.a, 0.0, 1.0);\n");
|
| - }
|
| + src = inputColor;
|
| }
|
|
|
| - builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
|
| + GrGLSLExpr4 dst;
|
| if (gUseUnpremul) {
|
| + builder->fsCodeAppendf("\t\tvec4 dst = %s;\n", dstColor);
|
| builder->fsCodeAppendf("\t\tdst.rgb = clamp(dst.rgb / dst.a, 0.0, 1.0);\n");
|
| + dst = GrGLSLExpr4("dst");
|
| + } else {
|
| + dst = GrGLSLExpr4(dstColor);
|
| }
|
|
|
| - builder->fsCodeAppendf("\t\t%s = %s.x * src * dst + %s.y * src + %s.z * dst + %s.w;\n", outputColor, kUni, kUni, kUni, kUni);
|
| + GrGLSLExpr4 kExpr(builder->getUniformCStr(fKUni));
|
| + builder->fsCodeAppendf("\t\t%s = %s;\n", outputColor,
|
| + (kExpr.x() * inputColor * dst +
|
| + kExpr.y() * src +
|
| + kExpr.z() * dst +
|
| + kExpr.w()).c_str());
|
| +
|
| builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outputColor);
|
| if (gUseUnpremul) {
|
| builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor);
|
|
|