diff options
author | 2020-10-14 04:55:09 +1100 | |
---|---|---|
committer | 2020-10-14 04:55:09 +1100 | |
commit | 54a45a29eacbc4509afbf92f5a0d6ff51643ca4d (patch) | |
tree | 7e2092a23ad276059b5bf2352ec33b100b830dab | |
parent | d6a860dfd7aa145e2401a6284e07c2f2a8549e3c (diff) |
emu/rendlay.cpp: Fix accumulation error causing black pixels on certain transparent colours.
-rw-r--r-- | src/emu/rendlay.cpp | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/src/emu/rendlay.cpp b/src/emu/rendlay.cpp index 266c3241638..e0728cb0b82 100644 --- a/src/emu/rendlay.cpp +++ b/src/emu/rendlay.cpp @@ -1969,9 +1969,9 @@ protected: { // compute premultiplied colors u32 const a(c.a * 255.0F); - u32 const r(c.r * c.a * (255.0F * 255.0F * 255.0F)); - u32 const g(c.g * c.a * (255.0F * 255.0F * 255.0F)); - u32 const b(c.b * c.a * (255.0F * 255.0F * 255.0F)); + u32 const r(u32(c.r * (255.0F * 255.0F)) * a); + u32 const g(u32(c.g * (255.0F * 255.0F)) * a); + u32 const b(u32(c.b * (255.0F * 255.0F)) * a); u32 const inva(255 - a); // we're translucent, add in the destination pixel contribution @@ -1981,10 +1981,11 @@ protected: for (u32 x = bounds.left(); x <= bounds.right(); ++x, ++dst) { rgb_t const dpix(*dst); - u32 const finala((a * 255) + (dpix.a() * inva)); - u32 const finalr(r + (dpix.r() * dpix.a() * inva)); - u32 const finalg(g + (dpix.g() * dpix.a() * inva)); - u32 const finalb(b + (dpix.b() * dpix.a() * inva)); + u32 const da(dpix.a()); + u32 const finala((a * 255) + (da * inva)); + u32 const finalr(r + (u32(dpix.r()) * da * inva)); + u32 const finalg(g + (u32(dpix.g()) * da * inva)); + u32 const finalb(b + (u32(dpix.b()) * da * inva)); // store the target pixel, dividing the RGBA values by the overall scale factor *dst = rgb_t(finala / 255, finalr / finala, finalg / finala, finalb / finala); @@ -2260,9 +2261,9 @@ private: u32 const a(c.a * fill * 255.0F); if (a) { - u32 const r(c.r * c.a * fill * (255.0F * 255.0F * 255.0F)); - u32 const g(c.g * c.a * fill * (255.0F * 255.0F * 255.0F)); - u32 const b(c.b * c.a * fill * (255.0F * 255.0F * 255.0F)); + u32 const r(u32(c.r * (255.0F * 255.0F)) * a); + u32 const g(u32(c.g * (255.0F * 255.0F)) * a); + u32 const b(u32(c.b * (255.0F * 255.0F)) * a); alpha_blend(dest, a, r, g, b, 255 - a); } } @@ -2270,10 +2271,11 @@ private: void alpha_blend(u32 &dest, u32 a, u32 r, u32 g, u32 b, u32 inva) { rgb_t const dpix(dest); - u32 const finala((a * 255) + (dpix.a() * inva)); - u32 const finalr(r + (dpix.r() * dpix.a() * inva)); - u32 const finalg(g + (dpix.g() * dpix.a() * inva)); - u32 const finalb(b + (dpix.b() * dpix.a() * inva)); + u32 const da(dpix.a()); + u32 const finala((a * 255) + (da * inva)); + u32 const finalr(r + (u32(dpix.r()) * da * inva)); + u32 const finalg(g + (u32(dpix.g()) * da * inva)); + u32 const finalb(b + (u32(dpix.b()) * da * inva)); dest = rgb_t(finala / 255, finalr / finala, finalg / finala, finalb / finala); } |