aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkXfermode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkXfermode.cpp')
-rw-r--r--src/core/SkXfermode.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/core/SkXfermode.cpp b/src/core/SkXfermode.cpp
index 705faf8e88..6f22aa43a6 100644
--- a/src/core/SkXfermode.cpp
+++ b/src/core/SkXfermode.cpp
@@ -984,13 +984,20 @@ public:
const TextureSamplerArray& samplers) SK_OVERRIDE {
const char* dstColorName = builder->dstColor();
GrAssert(NULL != dstColorName);
- builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.a);\n",
- outputColor, dstColorName, inputColor);
- builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb,"
- " (1.0 - %s.a) * %s.rgb + %s.rgb);\n",
- outputColor,
- inputColor, dstColorName, inputColor,
- dstColorName, inputColor, dstColorName);
+ if (NULL == inputColor) {
+ // the input color is solid white
+ builder->fsCodeAppendf("\t\t%s.a = 1.0;\n", outputColor);
+ builder->fsCodeAppendf("\t\t%s.rgb = vec3(1.0, 1.0, 1.0) - %s.aaa + %s.rgb;\n",
+ outputColor, dstColorName, dstColorName);
+ } else {
+ builder->fsCodeAppendf("\t\t%s.a = 1.0 - (1.0 - %s.a) * (1.0 - %s.a);\n",
+ outputColor, dstColorName, inputColor);
+ builder->fsCodeAppendf("\t\t%s.rgb = min((1.0 - %s.a) * %s.rgb + %s.rgb,"
+ " (1.0 - %s.a) * %s.rgb + %s.rgb);\n",
+ outputColor,
+ inputColor, dstColorName, inputColor,
+ dstColorName, inputColor, dstColorName);
+ }
}
static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { return 0; }