diff options
author | Eric Culp | 2012-07-06 15:21:21 -0400 |
---|---|---|
committer | Filippos Karapetis | 2019-04-01 00:29:23 +0300 |
commit | c666ecd41dc24554e10bb1d2c48276c5685c8cb3 (patch) | |
tree | 950a5e186ae90650a9278433c20eb12a052f2ee1 | |
parent | c2ddab7dd2f7778bac14be2479b9ca5ea995eca0 (diff) | |
download | scummvm-rg350-c666ecd41dc24554e10bb1d2c48276c5685c8cb3.tar.gz scummvm-rg350-c666ecd41dc24554e10bb1d2c48276c5685c8cb3.tar.bz2 scummvm-rg350-c666ecd41dc24554e10bb1d2c48276c5685c8cb3.zip |
GRAPHICS: Respect alpha and rgba formats in interpolation and conversion
-rw-r--r-- | graphics/scaler/intern.h | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/graphics/scaler/intern.h b/graphics/scaler/intern.h index 60f88eb00e..d32dd29179 100644 --- a/graphics/scaler/intern.h +++ b/graphics/scaler/intern.h @@ -72,21 +72,29 @@ static inline uint32 interpolate32_3_1(uint32 p1, uint32 p2) { */ template<typename ColorMask> uint32 interpolate32_2_1(uint32 pixel1, uint32 pixel2) { - uint32 rsum, gsum, bsum; + uint32 rsum, gsum, bsum, asum; - rsum = (pixel1 & ColorMask::kRedMask) << 1; - rsum += (pixel2 & ColorMask::kRedMask); + rsum = ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift) << 1; + rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift); rsum /= 3; + rsum <<= ColorMask::kRedShift; - gsum = (pixel1 & ColorMask::kGreenMask) << 1; - gsum += (pixel2 & ColorMask::kGreenMask); + gsum = ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift) << 1; + gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift); gsum /= 3; + gsum <<= ColorMask::kGreenShift; - bsum = (pixel1 & ColorMask::kBlueMask) << 1; - bsum += (pixel2 & ColorMask::kBlueMask); + bsum = ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift) << 1; + bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift); bsum /= 3; + bsum <<= ColorMask::kBlueShift; - return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask); + asum = ((pixel1 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift) << 1; + asum += ((pixel2 & ColorMask::kAlphaMask) >> ColorMask::kAlphaShift); + asum /= 3; + asum <<= ColorMask::kAlphaShift; + + return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask) | (asum & ColorMask::kAlphaMask); } /** @@ -252,24 +260,26 @@ inline uint32 interpolate32_14_1_1<Graphics::ColorMasks<565> >(uint32 p1, uint32 */ template<typename ColorMask> -uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3) -{ +uint32 interpolate32_1_1_1(uint32 pixel1, uint32 pixel2, uint32 pixel3) { uint32 rsum, gsum, bsum; - rsum = (pixel1 & ColorMask::kRedMask); - rsum += (pixel2 & ColorMask::kRedMask); - rsum += (pixel3 & ColorMask::kRedMask); + rsum = ((pixel1 & ColorMask::kRedMask) >> ColorMask::kRedShift); + rsum += ((pixel2 & ColorMask::kRedMask) >> ColorMask::kRedShift); + rsum += ((pixel3 & ColorMask::kRedMask) >> ColorMask::kRedShift); rsum /= 3; + rsum <<= ColorMask::kRedShift; - gsum = (pixel1 & ColorMask::kGreenMask); - gsum += (pixel2 & ColorMask::kGreenMask); - gsum += (pixel3 & ColorMask::kGreenMask); + gsum = ((pixel1 & ColorMask::kGreenMask) >> ColorMask::kGreenShift); + gsum += ((pixel2 & ColorMask::kGreenMask) >> ColorMask::kGreenShift); + gsum += ((pixel3 & ColorMask::kGreenMask) >> ColorMask::kGreenShift); gsum /= 3; + gsum <<= ColorMask::kGreenShift; - bsum = (pixel1 & ColorMask::kBlueMask); - bsum += (pixel2 & ColorMask::kBlueMask); - bsum += (pixel3 & ColorMask::kBlueMask); + bsum = ((pixel1 & ColorMask::kBlueMask) >> ColorMask::kBlueShift); + bsum += ((pixel2 & ColorMask::kBlueMask) >> ColorMask::kBlueShift); + bsum += ((pixel3 & ColorMask::kBlueMask) >> ColorMask::kBlueShift); bsum /= 3; + bsum <<= ColorMask::kBlueShift; return (rsum & ColorMask::kRedMask) | (gsum & ColorMask::kGreenMask) | (bsum & ColorMask::kBlueMask); } |