Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Fixed bug with converting colorkey surface to texture
- Loading branch information
Showing
with
70 additions
and
0 deletions.
-
+66
−0
src/video/SDL_surface.c
-
+4
−0
src/video/SDL_video.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) |
|
|
{ |
|
|
|
@@ -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); |
|
|
} |
|
|