Fixed bug with converting colorkey surface to texture
--HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%403246
This commit is contained in:
parent
f341bd32dd
commit
de690ebe5d
2 changed files with 70 additions and 0 deletions
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue