From 6f3204f4481743b72bc918f4511f1afef0ac2989 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 25 Nov 2008 02:12:19 +0000 Subject: [PATCH] Fixed bug with converting colorkey surface to texture --- src/video/SDL_surface.c | 66 +++++++++++++++++++++++++++++++++++++++++ src/video/SDL_video.c | 4 +++ 2 files changed, 70 insertions(+) diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c index 6102ce680..238302938 100644 --- a/src/video/SDL_surface.c +++ b/src/video/SDL_surface.c @@ -269,6 +269,72 @@ SDL_SetColorKey(SDL_Surface * surface, Uint32 flag, Uint32 key) 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 --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 28eade9a0..b9bca0c0f 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -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 @@ SDL_CreateTextureFromSurface(Uint32 format, SDL_Surface * surface) } dst = SDL_ConvertSurface(surface, dst_fmt, 0); if (dst) { + SDL_ConvertColorkeyToAlpha(dst); SDL_UpdateTexture(textureID, NULL, dst->pixels, dst->pitch); SDL_FreeSurface(dst); }