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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
diff --git a/src/video/SDL_surface.c b/src/video/SDL_surface.c
index bbbe7b5..9f1a2a1 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);