Commit 74c55335 authored by Sam Lantinga's avatar Sam Lantinga

Clarified the code in the pixel format allocation

Added support for direct color 8-bpp modes.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401028
parent c73a9384
...@@ -61,160 +61,45 @@ SDL_PixelFormat *SDL_AllocFormat(int bpp, ...@@ -61,160 +61,45 @@ SDL_PixelFormat *SDL_AllocFormat(int bpp,
/* Set up the format */ /* Set up the format */
format->BitsPerPixel = bpp; format->BitsPerPixel = bpp;
format->BytesPerPixel = (bpp+7)/8; format->BytesPerPixel = (bpp+7)/8;
switch (bpp) { if ( Rmask || Bmask || Gmask ) { /* Packed pixels with custom mask */
case 1: format->palette = NULL;
/* Create the 2 color black-white palette */ format->Rshift = 0;
format->palette = (SDL_Palette *)malloc( format->Rloss = 8;
sizeof(SDL_Palette)); if ( Rmask ) {
if ( format->palette == NULL ) { for ( mask = Rmask; !(mask&0x01); mask >>= 1 )
SDL_FreeFormat(format); ++format->Rshift;
SDL_OutOfMemory(); for ( ; (mask&0x01); mask >>= 1 )
return(NULL); --format->Rloss;
} }
(format->palette)->ncolors = 2; format->Gshift = 0;
(format->palette)->colors = (SDL_Color *)malloc( format->Gloss = 8;
(format->palette)->ncolors*sizeof(SDL_Color)); if ( Gmask ) {
if ( (format->palette)->colors == NULL ) { for ( mask = Gmask; !(mask&0x01); mask >>= 1 )
SDL_FreeFormat(format); ++format->Gshift;
SDL_OutOfMemory(); for ( ; (mask&0x01); mask >>= 1 )
return(NULL); --format->Gloss;
} }
format->palette->colors[0].r = 0xFF; format->Bshift = 0;
format->palette->colors[0].g = 0xFF; format->Bloss = 8;
format->palette->colors[0].b = 0xFF; if ( Bmask ) {
format->palette->colors[1].r = 0x00; for ( mask = Bmask; !(mask&0x01); mask >>= 1 )
format->palette->colors[1].g = 0x00; ++format->Bshift;
format->palette->colors[1].b = 0x00; for ( ; (mask&0x01); mask >>= 1 )
format->Rloss = 8; --format->Bloss;
format->Gloss = 8; }
format->Bloss = 8; format->Ashift = 0;
format->Aloss = 8; format->Aloss = 8;
format->Rshift = 0; if ( Amask ) {
format->Gshift = 0; for ( mask = Amask; !(mask&0x01); mask >>= 1 )
format->Bshift = 0; ++format->Ashift;
format->Ashift = 0; for ( ; (mask&0x01); mask >>= 1 )
format->Rmask = 0; --format->Aloss;
format->Gmask = 0; }
format->Bmask = 0; format->Rmask = Rmask;
format->Amask = 0; format->Gmask = Gmask;
break; format->Bmask = Bmask;
format->Amask = Amask;
case 4: } else if ( bpp > 8 ) { /* Packed pixels with standard mask */
/* Create the 16 color VGA palette */
format->palette = (SDL_Palette *)malloc(
sizeof(SDL_Palette));
if ( format->palette == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
(format->palette)->ncolors = 16;
(format->palette)->colors = (SDL_Color *)malloc(
(format->palette)->ncolors*sizeof(SDL_Color));
if ( (format->palette)->colors == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
/* Punt for now, will this ever be used? */
memset((format->palette)->colors, 0,
(format->palette)->ncolors*sizeof(SDL_Color));
/* Palettized formats have no mask info */
format->Rloss = 8;
format->Gloss = 8;
format->Bloss = 8;
format->Aloss = 8;
format->Rshift = 0;
format->Gshift = 0;
format->Bshift = 0;
format->Ashift = 0;
format->Rmask = 0;
format->Gmask = 0;
format->Bmask = 0;
format->Amask = 0;
break;
case 8:
/* Create an empty 256 color palette */
format->palette = (SDL_Palette *)malloc(
sizeof(SDL_Palette));
if ( format->palette == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
(format->palette)->ncolors = 256;
(format->palette)->colors = (SDL_Color *)malloc(
(format->palette)->ncolors*sizeof(SDL_Color));
if ( (format->palette)->colors == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
memset((format->palette)->colors, 0,
(format->palette)->ncolors*sizeof(SDL_Color));
/* Palettized formats have no mask info */
format->Rloss = 8;
format->Gloss = 8;
format->Bloss = 8;
format->Aloss = 8;
format->Rshift = 0;
format->Gshift = 0;
format->Bshift = 0;
format->Ashift = 0;
format->Rmask = 0;
format->Gmask = 0;
format->Bmask = 0;
format->Amask = 0;
break;
default:
/* No palette, just packed pixel info */
format->palette = NULL;
format->Rshift = 0;
format->Rloss = 8;
if ( Rmask ) {
for ( mask = Rmask; !(mask&0x01); mask >>= 1 )
++format->Rshift;
for ( ; (mask&0x01); mask >>= 1 )
--format->Rloss;
}
format->Gshift = 0;
format->Gloss = 8;
if ( Gmask ) {
for ( mask = Gmask; !(mask&0x01); mask >>= 1 )
++format->Gshift;
for ( ; (mask&0x01); mask >>= 1 )
--format->Gloss;
}
format->Bshift = 0;
format->Bloss = 8;
if ( Bmask ) {
for ( mask = Bmask; !(mask&0x01); mask >>= 1 )
++format->Bshift;
for ( ; (mask&0x01); mask >>= 1 )
--format->Bloss;
}
format->Ashift = 0;
format->Aloss = 8;
if ( Amask ) {
for ( mask = Amask; !(mask&0x01); mask >>= 1 )
++format->Ashift;
for ( ; (mask&0x01); mask >>= 1 )
--format->Aloss;
}
format->Rmask = Rmask;
format->Gmask = Gmask;
format->Bmask = Bmask;
format->Amask = Amask;
break;
}
/* Calculate some standard bitmasks, if necessary
* Note: This could conflict with an alpha mask, if given.
*/
if ( (bpp > 8) && !format->Rmask && !format->Gmask && !format->Bmask ) {
/* R-G-B */ /* R-G-B */
if ( bpp > 24 ) if ( bpp > 24 )
bpp = 24; bpp = 24;
...@@ -227,6 +112,52 @@ SDL_PixelFormat *SDL_AllocFormat(int bpp, ...@@ -227,6 +112,52 @@ SDL_PixelFormat *SDL_AllocFormat(int bpp,
format->Rmask = ((0xFF>>format->Rloss)<<format->Rshift); format->Rmask = ((0xFF>>format->Rloss)<<format->Rshift);
format->Gmask = ((0xFF>>format->Gloss)<<format->Gshift); format->Gmask = ((0xFF>>format->Gloss)<<format->Gshift);
format->Bmask = ((0xFF>>format->Bloss)<<format->Bshift); format->Bmask = ((0xFF>>format->Bloss)<<format->Bshift);
} else { /* Palettized mode */
int i, ncolors = 1;
for ( i = 0; i < bpp; ++i ) {
ncolors *= 2;
}
format->palette = (SDL_Palette *)malloc(sizeof(SDL_Palette));
if ( format->palette == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
(format->palette)->ncolors = ncolors;
(format->palette)->colors = (SDL_Color *)malloc(
(format->palette)->ncolors*sizeof(SDL_Color));
if ( (format->palette)->colors == NULL ) {
SDL_FreeFormat(format);
SDL_OutOfMemory();
return(NULL);
}
if ( ncolors == 2 ) {
/* Create a black and white bitmap palette */
format->palette->colors[0].r = 0xFF;
format->palette->colors[0].g = 0xFF;
format->palette->colors[0].b = 0xFF;
format->palette->colors[1].r = 0x00;
format->palette->colors[1].g = 0x00;
format->palette->colors[1].b = 0x00;
} else {
/* Create an empty palette */
memset((format->palette)->colors, 0,
(format->palette)->ncolors*sizeof(SDL_Color));
}
/* Palettized formats have no mask info */
format->Rloss = 8;
format->Gloss = 8;
format->Bloss = 8;
format->Aloss = 8;
format->Rshift = 0;
format->Gshift = 0;
format->Bshift = 0;
format->Ashift = 0;
format->Rmask = 0;
format->Gmask = 0;
format->Bmask = 0;
format->Amask = 0;
} }
return(format); return(format);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment