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); |