From 1834a2f670491dd950e3101b1b0172bd37fba39b Mon Sep 17 00:00:00 2001 From: smatz Date: Thu, 26 Jun 2008 16:47:29 +0000 Subject: [PATCH] (svn r13640) -Codechange: make colours behind not fully solid objects less darker for BM_TRANSPARENT (for 32bpp blitters) --- src/blitter/32bpp_anim.cpp | 25 +++++++++++++++++-------- src/blitter/32bpp_base.hpp | 7 ++++--- src/blitter/32bpp_optimized.cpp | 19 +++++++++++++------ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/blitter/32bpp_anim.cpp b/src/blitter/32bpp_anim.cpp index 9523c2decf..1c91911ffe 100644 --- a/src/blitter/32bpp_anim.cpp +++ b/src/blitter/32bpp_anim.cpp @@ -136,15 +136,24 @@ inline void Blitter_32bppAnim::Draw(const Blitter::BlitterParams *bp, ZoomLevel * we produce a result the newgrf maker didn't expect ;) */ /* Make the current color a bit more black, so it looks like this image is transparent */ - src_px += n; src_n += n; - - do { - *dst = MakeTransparent(*dst, 192); - *anim = remap[*anim]; - anim++; - dst++; - } while (--n != 0); + if (src_px->a == 255) { + src_px += n; + do { + *dst = MakeTransparent(*dst, 3, 4); + *anim = remap[*anim]; + anim++; + dst++; + } while (--n != 0); + } else { + do { + *dst = MakeTransparent(*dst, (256 * 4 - src_px->a), 256 * 4); + *anim = remap[*anim]; + anim++; + dst++; + src_px++; + } while (--n != 0); + } break; default: diff --git a/src/blitter/32bpp_base.hpp b/src/blitter/32bpp_base.hpp index 30df9dd0ea..1e9ae1d167 100644 --- a/src/blitter/32bpp_base.hpp +++ b/src/blitter/32bpp_base.hpp @@ -105,16 +105,17 @@ public: /** * Make a pixel looks like it is transparent. * @param colour the colour already on the screen. - * @param amount the amount of transparency, times 256. + * @param nom the amount of transparency, nominator, makes colour lighter. + * @param denom denominator, makes colour darker. * @return the new colour for the screen. */ - static inline uint32 MakeTransparent(uint32 colour, uint amount) + static inline uint32 MakeTransparent(uint32 colour, uint nom, uint denom = 256) { uint r = GB(colour, 16, 8); uint g = GB(colour, 8, 8); uint b = GB(colour, 0, 8); - return ComposeColour(0xFF, r * amount / 256, g * amount / 256, b * amount / 256); + return ComposeColour(0xFF, r * nom / denom, g * nom / denom, b * nom / denom); } /** diff --git a/src/blitter/32bpp_optimized.cpp b/src/blitter/32bpp_optimized.cpp index 6a6ad65426..717701bce6 100644 --- a/src/blitter/32bpp_optimized.cpp +++ b/src/blitter/32bpp_optimized.cpp @@ -142,13 +142,20 @@ inline void Blitter_32bppOptimized::Draw(const Blitter::BlitterParams *bp, ZoomL * we produce a result the newgrf maker didn't expect ;) */ /* Make the current color a bit more black, so it looks like this image is transparent */ - src_px += n; src_n += n; - - do { - *dst = MakeTransparent(*dst, 192); - dst++; - } while (--n != 0); + if (src_px->a == 255) { + src_px += n; + do { + *dst = MakeTransparent(*dst, 3, 4); + dst++; + } while (--n != 0); + } else { + do { + *dst = MakeTransparent(*dst, (256 * 4 - src_px->a), 256 * 4); + dst++; + src_px++; + } while (--n != 0); + } break; default: