From 909584009b14c5ddf5c19b228e024c3991277286 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 12 Aug 2003 15:17:20 +0000 Subject: [PATCH] Date: Tue, 12 Aug 2003 14:26:19 +0200 (MEST) From: "Mattias Engdeg?rd" Subject: bug in SDL_GetRGB/GetRGBA There's an embarrassing bug in GetRGB/GetRGBA which apparently has been there for years. It incorrectly converts colours with < 8 bits/channel. It came to my attention today in #sdl. What it does now is (for each channel): rv = (pixel & fmt->Rmask) >> fmt->Rshift; *r = (rv << fmt->Rloss) + (rv >> (8 - fmt->Rloss)); which is wrong; the last line should be *r = (rv << fmt->Rloss) + (rv >> (8 - (fmt->Rloss << 1))); --- src/video/SDL_pixels.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/video/SDL_pixels.c b/src/video/SDL_pixels.c index 8af242b97..ecc6dc38a 100644 --- a/src/video/SDL_pixels.c +++ b/src/video/SDL_pixels.c @@ -381,14 +381,14 @@ void SDL_GetRGBA(Uint32 pixel, SDL_PixelFormat *fmt, */ unsigned v; v = (pixel & fmt->Rmask) >> fmt->Rshift; - *r = (v << fmt->Rloss) + (v >> (8 - fmt->Rloss)); + *r = (v << fmt->Rloss) + (v >> (8 - (fmt->Rloss << 1))); v = (pixel & fmt->Gmask) >> fmt->Gshift; - *g = (v << fmt->Gloss) + (v >> (8 - fmt->Gloss)); + *g = (v << fmt->Gloss) + (v >> (8 - (fmt->Gloss << 1))); v = (pixel & fmt->Bmask) >> fmt->Bshift; - *b = (v << fmt->Bloss) + (v >> (8 - fmt->Bloss)); + *b = (v << fmt->Bloss) + (v >> (8 - (fmt->Bloss << 1))); if(fmt->Amask) { v = (pixel & fmt->Amask) >> fmt->Ashift; - *a = (v << fmt->Aloss) + (v >> (8 - fmt->Aloss)); + *a = (v << fmt->Aloss) + (v >> (8 - (fmt->Aloss << 1))); } else *a = SDL_ALPHA_OPAQUE; } else { @@ -405,11 +405,11 @@ void SDL_GetRGB(Uint32 pixel, SDL_PixelFormat *fmt, Uint8 *r,Uint8 *g,Uint8 *b) /* the note for SDL_GetRGBA above applies here too */ unsigned v; v = (pixel & fmt->Rmask) >> fmt->Rshift; - *r = (v << fmt->Rloss) + (v >> (8 - fmt->Rloss)); + *r = (v << fmt->Rloss) + (v >> (8 - (fmt->Rloss << 1))); v = (pixel & fmt->Gmask) >> fmt->Gshift; - *g = (v << fmt->Gloss) + (v >> (8 - fmt->Gloss)); + *g = (v << fmt->Gloss) + (v >> (8 - (fmt->Gloss << 1))); v = (pixel & fmt->Bmask) >> fmt->Bshift; - *b = (v << fmt->Bloss) + (v >> (8 - fmt->Bloss)); + *b = (v << fmt->Bloss) + (v >> (8 - (fmt->Bloss << 1))); } else { *r = fmt->palette->colors[pixel].r; *g = fmt->palette->colors[pixel].g;