# HG changeset patch # User Sam Lantinga # Date 1142836678 0 # Node ID 61c237f69076a87dc0c96e5fe0a4cbffcdc9db61 # Parent 011b633fa0c9694f73805db5fbf9642f4234773a Fixed bug #90 The palette -> RGBA blit wasn't following the rule: * RGB->RGBA: * SDL_SRCALPHA not set: * copy RGB, set destination alpha to source per-surface alpha value. diff -r 011b633fa0c9 -r 61c237f69076 src/video/SDL_pixels.c --- a/src/video/SDL_pixels.c Sun Mar 19 19:03:40 2006 +0000 +++ b/src/video/SDL_pixels.c Mon Mar 20 06:37:58 2006 +0000 @@ -456,44 +456,46 @@ return(map); } /* Map from Palette to BitField */ -static Uint8 *Map1toN(SDL_Palette *src, SDL_PixelFormat *dst) +static Uint8 *Map1toN(SDL_PixelFormat *src, SDL_PixelFormat *dst) { Uint8 *map; int i; int bpp; unsigned alpha; + SDL_Palette *pal = src->palette; bpp = ((dst->BytesPerPixel == 3) ? 4 : dst->BytesPerPixel); - map = (Uint8 *)SDL_malloc(src->ncolors*bpp); + map = (Uint8 *)SDL_malloc(pal->ncolors*bpp); if ( map == NULL ) { SDL_OutOfMemory(); return(NULL); } - alpha = dst->Amask ? SDL_ALPHA_OPAQUE : 0; + alpha = dst->Amask ? src->alpha : 0; /* We memory copy to the pixel map so the endianness is preserved */ - for ( i=0; incolors; ++i ) { + for ( i=0; incolors; ++i ) { ASSEMBLE_RGBA(&map[i*bpp], dst->BytesPerPixel, dst, - src->colors[i].r, src->colors[i].g, - src->colors[i].b, alpha); + pal->colors[i].r, pal->colors[i].g, + pal->colors[i].b, alpha); } return(map); } /* Map from BitField to Dithered-Palette to Palette */ -static Uint8 *MapNto1(SDL_PixelFormat *src, SDL_Palette *dst, int *identical) +static Uint8 *MapNto1(SDL_PixelFormat *src, SDL_PixelFormat *dst, int *identical) { /* Generate a 256 color dither palette */ SDL_Palette dithered; SDL_Color colors[256]; + SDL_Palette *pal = dst->palette; /* SDL_DitherColors does not initialize the 'unused' component of colors, - but Map1to1 compares it against dst, so we should initialize it. */ + but Map1to1 compares it against pal, so we should initialize it. */ SDL_memset(colors, 0, sizeof(colors)); dithered.ncolors = 256; SDL_DitherColors(colors, 8); dithered.colors = colors; - return(Map1to1(&dithered, dst, identical)); + return(Map1to1(&dithered, pal, identical)); } SDL_BlitMap *SDL_AllocBlitMap(void) @@ -573,7 +575,7 @@ default: /* Palette --> BitField */ - map->table = Map1toN(srcfmt->palette, dstfmt); + map->table = Map1toN(srcfmt, dstfmt); if ( map->table == NULL ) { return(-1); } @@ -584,8 +586,7 @@ switch (dstfmt->BytesPerPixel) { case 1: /* BitField --> Palette */ - map->table = MapNto1(srcfmt, - dstfmt->palette, &map->identity); + map->table = MapNto1(srcfmt, dstfmt, &map->identity); if ( ! map->identity ) { if ( map->table == NULL ) { return(-1);