Defect: SDL_getRGB SDL_getRGBA

This is a defect report for SDL_getRGB and
SDL_getRGBA. If defects should be posted to a
different address please let me know.

Version: 1.2.2 and 1.2.5
Files: SDL_pixels.c
Functions: SDL_getRGB and SDL_getRGBA
Description:

SDL_getRGB and SDL_getRGBA do not convert color
components with less than 8-bits per component to full
8-bits where loss bits are filled with most
significant bits of the component.

DOCUMENTATION ON THESE FUNCTIONS

"This function uses the entire 8-bit [0…255] range
when converting color components from pixel formats
with less than 8-bits per RGB component (e.g., a
completely white pixel in 16-bit RGB565 format would
return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).

If the surface has no alpha component, the alpha will
be returned as 0xff (100% opaque)."

DEFECT IN CODE

Example for red component in SDL_getRGB

For RGB565
fmt->Rmask = 0xF800
fmt->Rshift = 11
fmt->Rloss = 3

Current code for SDL_getRGB red component

rv = (pixel & fmt->Rmask) >> fmt->Rshift;
*r = (rv << fmt->Rloss) + (rv >> (8 - fmt->Rloss));

if pixel == 0xFFFF then

rv = (pixel & fmt->Rmask) >> fmt->Rshift;
rv = (0x0000FFFF & 0xF800) >> 11;
rv = (0xF800) >> 11;
rv = 0x1F;

*r = (rv << fmt->Rloss) + (rv >> (8 - fmt->Rloss));
*r = (0x1F << 3) + (0x1F >> (8-3));
*r = (0xF8) + (0x1F >> 5);
*r = (0xF8) + (0)
*r = 0xF8

This is incorrect. The result should be 0xFF.

The fix can be accomplished several ways.

Fix #1

rv = (pixel & fmt->Rmask) >> fmt->Rshift;
rv = (rv << fmt->Rloss);
*r += (rv >> (8 - fmt->Rloss));

or

Fix #2

rv = (pixel & fmt->Rmask) >> fmt->Rshift;
*r = (rv << fmt->Rloss) + (rv >> (8 - (fmt->Rloss <<
1));

These fixes as documented in the original source
require components to be 4-8 bits in size.

EXAMPLE PROGRAM

The attached tar.gz file contains a sample program to
demonstrate the library function vs. one of the fix
#2.

Greg Smith
@Greg_Smith__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com
-------------- next part --------------
A non-text attachment was scrubbed…
Name: SDL_getRGBfix.tar.gz
Type: application/x-gzip-compressed
Size: 1707 bytes
Desc: SDL_getRGBfix.tar.gz
URL: http://lists.libsdl.org/pipermail/sdl-libsdl.org/attachments/20021212/15ab6209/attachment.bin

We ordinary humans call them “bug reports”, by the way. :)On Thu, Dec 12, 2002 at 12:04:25PM -0800, Greg Smith wrote:

This is a defect report for SDL_getRGB and
SDL_getRGBA. If defects should be posted to a
different address please let me know.


Glenn Maynard