Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Fixed bug with converting colorkey surface to texture
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Nov 25, 2008
1 parent a96426d commit 6f3204f
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 0 deletions.
66 changes: 66 additions & 0 deletions src/video/SDL_surface.c
Expand Up @@ -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)
{
Expand Down
4 changes: 4 additions & 0 deletions src/video/SDL_video.c
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 6f3204f

Please sign in to comment.