summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylvain Becker <sylvain.becker@gmail.com>2021-02-03 09:32:09 +0100
committerSylvain Becker <sylvain.becker@gmail.com>2021-02-03 09:32:09 +0100
commit34aea31cc7ea16703244425dc863f820a029f66e (patch)
tree6ff38e6cf95b208900bac83f9fc9d3ad7ff6bed9
parentf9747ed8501b1ef595114cf076f9d10123066301 (diff)
downloadsdl-34aea31cc7ea16703244425dc863f820a029f66e.tar.gz
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
-rw-r--r--src/video/SDL_surface.c121
1 files changed, 57 insertions, 64 deletions
diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c
index bbbe7b54d..9f1a2a161 100644
--- a/src/video/SDL_surface.c
+++ b/src/video/SDL_surface.c
@@ -326,11 +326,12 @@ SDL_GetColorKey(SDL_Surface * surface, Uint32 * key)
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
SDL_ConvertColorkeyToAlpha(SDL_Surface * surface, SDL_bool ignore_alpha)
{
- int x, y;
+ int x, y, bpp;
if (!surface) {
return;
@@ -341,82 +342,74 @@ SDL_ConvertColorkeyToAlpha(SDL_Surface * surface, SDL_bool ignore_alpha)
return;
}
+ bpp = surface->format->BytesPerPixel;
+
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);
-
- /* Ignore, or not, alpha in colorkey comparison */
- if (ignore_alpha) {
- ckey &= mask;
- row = (Uint16 *) surface->pixels;
- for (y = surface->h; y--;) {
- spot = row;
- for (x = surface->w; x--;) {
- if ((*spot & mask) == ckey) {
- *spot &= mask;
- }
- ++spot;
+ if (bpp == 2) {
+ Uint16 *row, *spot;
+ Uint16 ckey = (Uint16) surface->map->info.colorkey;
+ Uint16 mask = (Uint16) (~surface->format->Amask);
+
+ /* Ignore, or not, alpha in colorkey comparison */
+ if (ignore_alpha) {
+ ckey &= mask;
+ row = (Uint16 *) surface->pixels;
+ for (y = surface->h; y--;) {
+ spot = row;
+ for (x = surface->w; x--;) {
+ if ((*spot & mask) == ckey) {
+ *spot &= mask;
}
- row += surface->pitch / 2;
+ ++spot;
}
- } else {
- 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;
+ }
+ } else {
+ row = (Uint16 *) surface->pixels;
+ for (y = surface->h; y--;) {
+ spot = row;
+ for (x = surface->w; x--;) {
+ if (*spot == ckey) {
+ *spot &= mask;
}
- row += surface->pitch / 2;
+ ++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;
-
- /* Ignore, or not, alpha in colorkey comparison */
- if (ignore_alpha) {
- ckey &= mask;
- row = (Uint32 *) surface->pixels;
- for (y = surface->h; y--;) {
- spot = row;
- for (x = surface->w; x--;) {
- if ((*spot & mask) == ckey) {
- *spot &= mask;
- }
- ++spot;
+ } else if (bpp == 4) {
+ Uint32 *row, *spot;
+ Uint32 ckey = surface->map->info.colorkey;
+ Uint32 mask = ~surface->format->Amask;
+
+ /* Ignore, or not, alpha in colorkey comparison */
+ if (ignore_alpha) {
+ ckey &= mask;
+ row = (Uint32 *) surface->pixels;
+ for (y = surface->h; y--;) {
+ spot = row;
+ for (x = surface->w; x--;) {
+ if ((*spot & mask) == ckey) {
+ *spot &= mask;
}
- row += surface->pitch / 4;
+ ++spot;
}
- } else {
- 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;
+ }
+ } else {
+ row = (Uint32 *) surface->pixels;
+ for (y = surface->h; y--;) {
+ spot = row;
+ for (x = surface->w; x--;) {
+ if (*spot == ckey) {
+ *spot &= mask;
}
- row += surface->pitch / 4;
+ ++spot;
}
+ row += surface->pitch / 4;
}
}
- break;
}
SDL_UnlockSurface(surface);