tweak screen math

Seems to help get past our r,g,b <= a asserts better.
I guess it keeps more precision from the small s*d term?

    Old:  (s+d) - (s*d)
    New:  s + (d - (s*d))

Change-Id: Ib9b9472e2c08aef688bbfdbccaf0bd45b7bf3ecd
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/268592
Commit-Queue: Mike Klein <mtklein@google.com>
Auto-Submit: Mike Klein <mtklein@google.com>
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/src/core/SkVMBlitter.cpp b/src/core/SkVMBlitter.cpp
index 2832ebb..8abef95 100644
--- a/src/core/SkVMBlitter.cpp
+++ b/src/core/SkVMBlitter.cpp
@@ -695,10 +695,12 @@
         };
 
         case SkBlendMode::kScreen: return {
-            p->sub(p->add(src.r, dst.r), p->mul(src.r, dst.r)),
-            p->sub(p->add(src.g, dst.g), p->mul(src.g, dst.g)),
-            p->sub(p->add(src.b, dst.b), p->mul(src.b, dst.b)),
-            p->sub(p->add(src.a, dst.a), p->mul(src.a, dst.a)),
+            // (s+d)-(s*d) gave us trouble with our "r,g,b <= after blending" asserts.
+            // It's kind of plausible that s + (d - sd) keeps more precision?
+            p->add(src.r, p->sub(dst.r, p->mul(src.r, dst.r))),
+            p->add(src.g, p->sub(dst.g, p->mul(src.g, dst.g))),
+            p->add(src.b, p->sub(dst.b, p->mul(src.b, dst.b))),
+            p->add(src.a, p->sub(dst.a, p->mul(src.a, dst.a))),
         };
     }
 }