# HG changeset patch # User Sam Lantinga # Date 1060701440 0 # Node ID c0522010bb6d735fdff995eb3e8ddd82711db005 # Parent 91400ecf307d07a8b2c30d5155d436b97b310ff1 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))); diff -r 91400ecf307d -r c0522010bb6d src/video/SDL_pixels.c --- 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;