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