mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-25 09:17:12 +01:00
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:
parent
85235985fb
commit
c0166a29b7
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user