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)));
--- a/src/video/SDL_pixels.c Mon Aug 11 22:28:13 2003 +0000
+++ b/src/video/SDL_pixels.c Tue Aug 12 15:17:20 2003 +0000
@@ -381,14 +381,14 @@
*/
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 @@
/* 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;