mirror of
https://github.com/yawut/SDL.git
synced 2026-09-08 09:06:29 -05:00
Fixed bug with converting colorkey surface to texture
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user