SDL_ConvertColorkeyToAlpha: remove and clarify a FIXME

This function doesn't handle bpp 1 or 3 case, because those formats never have an alpha channel
This commit is contained in:
Sylvain Becker 2021-02-03 09:32:09 +01:00
parent 85235985fb
commit c0166a29b7

View File

@ -326,11 +326,12 @@ SDL_GetColorKey(SDL_Surface * surface, Uint32 * key)
return 0; return 0;
} }
/* This is a fairly slow function to switch from colorkey to alpha */ /* This is a fairly slow function to switch from colorkey to alpha
NB: it doesn't handle bpp 1 or 3, because they have no alpha channel */
static void static void
SDL_ConvertColorkeyToAlpha(SDL_Surface * surface, SDL_bool ignore_alpha) SDL_ConvertColorkeyToAlpha(SDL_Surface * surface, SDL_bool ignore_alpha)
{ {
int x, y; int x, y, bpp;
if (!surface) { if (!surface) {
return; return;
@ -341,82 +342,74 @@ SDL_ConvertColorkeyToAlpha(SDL_Surface * surface, SDL_bool ignore_alpha)
return; return;
} }
bpp = surface->format->BytesPerPixel;
SDL_LockSurface(surface); SDL_LockSurface(surface);
switch (surface->format->BytesPerPixel) { if (bpp == 2) {
case 2: Uint16 *row, *spot;
{ Uint16 ckey = (Uint16) surface->map->info.colorkey;
Uint16 *row, *spot; Uint16 mask = (Uint16) (~surface->format->Amask);
Uint16 ckey = (Uint16) surface->map->info.colorkey;
Uint16 mask = (Uint16) (~surface->format->Amask);
/* Ignore, or not, alpha in colorkey comparison */ /* Ignore, or not, alpha in colorkey comparison */
if (ignore_alpha) { if (ignore_alpha) {
ckey &= mask; ckey &= mask;
row = (Uint16 *) surface->pixels; row = (Uint16 *) surface->pixels;
for (y = surface->h; y--;) { for (y = surface->h; y--;) {
spot = row; spot = row;
for (x = surface->w; x--;) { for (x = surface->w; x--;) {
if ((*spot & mask) == ckey) { if ((*spot & mask) == ckey) {
*spot &= mask; *spot &= mask;
}
++spot;
} }
row += surface->pitch / 2; ++spot;
} }
} else { row += surface->pitch / 2;
row = (Uint16 *) surface->pixels; }
for (y = surface->h; y--;) { } else {
spot = row; row = (Uint16 *) surface->pixels;
for (x = surface->w; x--;) { for (y = surface->h; y--;) {
if (*spot == ckey) { spot = row;
*spot &= mask; for (x = surface->w; x--;) {
} if (*spot == ckey) {
++spot; *spot &= mask;
} }
row += surface->pitch / 2; ++spot;
} }
row += surface->pitch / 2;
} }
} }
break; } else if (bpp == 4) {
case 3: Uint32 *row, *spot;
/* FIXME */ Uint32 ckey = surface->map->info.colorkey;
break; Uint32 mask = ~surface->format->Amask;
case 4:
{
Uint32 *row, *spot;
Uint32 ckey = surface->map->info.colorkey;
Uint32 mask = ~surface->format->Amask;
/* Ignore, or not, alpha in colorkey comparison */ /* Ignore, or not, alpha in colorkey comparison */
if (ignore_alpha) { if (ignore_alpha) {
ckey &= mask; ckey &= mask;
row = (Uint32 *) surface->pixels; row = (Uint32 *) surface->pixels;
for (y = surface->h; y--;) { for (y = surface->h; y--;) {
spot = row; spot = row;
for (x = surface->w; x--;) { for (x = surface->w; x--;) {
if ((*spot & mask) == ckey) { if ((*spot & mask) == ckey) {
*spot &= mask; *spot &= mask;
}
++spot;
} }
row += surface->pitch / 4; ++spot;
} }
} else { row += surface->pitch / 4;
row = (Uint32 *) surface->pixels; }
for (y = surface->h; y--;) { } else {
spot = row; row = (Uint32 *) surface->pixels;
for (x = surface->w; x--;) { for (y = surface->h; y--;) {
if (*spot == ckey) { spot = row;
*spot &= mask; for (x = surface->w; x--;) {
} if (*spot == ckey) {
++spot; *spot &= mask;
} }
row += surface->pitch / 4; ++spot;
} }
row += surface->pitch / 4;
} }
} }
break;
} }
SDL_UnlockSurface(surface); SDL_UnlockSurface(surface);