# HG changeset patch # User Sam Lantinga # Date 1227579139 0 # Node ID fa1095d42a5b3100d6a1e1e264fd9e4b52bd2760 # Parent 9bbe3bd94be804059da5c950b0139d5d6a01a6f4 Fixed bug with converting colorkey surface to texture diff -r 9bbe3bd94be8 -r fa1095d42a5b src/video/SDL_surface.c --- a/src/video/SDL_surface.c Tue Nov 25 00:48:25 2008 +0000 +++ b/src/video/SDL_surface.c Tue Nov 25 02:12:19 2008 +0000 @@ -269,6 +269,72 @@ return 0; } +/* This is a fairly slow function to switch from colorkey to alpha */ +void +SDL_ConvertColorkeyToAlpha(SDL_Surface *surface) +{ + int x, y; + + if (!surface) { + return; + } + + if (!(surface->map->info.flags & SDL_COPY_COLORKEY) || + !surface->format->Amask) { + return; + } + + SDL_LockSurface(surface); + + switch (surface->format->BytesPerPixel) { + case 2: + { + Uint16 *row, *spot; + Uint16 ckey = (Uint16)surface->map->info.colorkey; + Uint16 mask = (Uint16)(~surface->format->Amask); + + row = (Uint16 *)surface->pixels; + for (y = surface->h; y--; ) { + spot = row; + for (x = surface->w; x--; ) { + if (*spot == ckey) { + *spot &= mask; + } + ++spot; + } + row += surface->pitch / 2; + } + } + break; + case 3: + /* FIXME */ + break; + case 4: + { + Uint32 *row, *spot; + Uint32 ckey = surface->map->info.colorkey; + Uint32 mask = ~surface->format->Amask; + + row = (Uint32 *)surface->pixels; + for (y = surface->h; y--; ) { + spot = row; + for (x = surface->w; x--; ) { + if (*spot == ckey) { + *spot &= mask; + } + ++spot; + } + row += surface->pitch / 4; + } + } + break; + } + + SDL_UnlockSurface(surface); + + SDL_SetColorKey(surface, 0, 0); +} + int SDL_SetSurfaceColorMod(SDL_Surface * surface, Uint8 r, Uint8 g, Uint8 b) { diff -r 9bbe3bd94be8 -r fa1095d42a5b src/video/SDL_video.c --- a/src/video/SDL_video.c Tue Nov 25 00:48:25 2008 +0000 +++ b/src/video/SDL_video.c Tue Nov 25 02:12:19 2008 +0000 @@ -46,6 +46,9 @@ #endif #endif /* SDL_VIDEO_OPENGL */ +/* From SDL_surface.c */ +extern void SDL_ConvertColorkeyToAlpha(SDL_Surface *surface); + /* Available video drivers */ static VideoBootStrap *bootstrap[] = { #if SDL_VIDEO_DRIVER_COCOA @@ -1585,6 +1588,7 @@ } dst = SDL_ConvertSurface(surface, dst_fmt, 0); if (dst) { + SDL_ConvertColorkeyToAlpha(dst); SDL_UpdateTexture(textureID, NULL, dst->pixels, dst->pitch); SDL_FreeSurface(dst); }