Fix crash happening on 8 and 16 bit color displays.

Commit f51dbd0669 changed the way of generating
images of ships taking damage, and assumed that the SDL_Surfaces containing the
images were always 24 or 32 bpp. However, SDL will already have converted them
to the display format, so we need to properly handle 8 and 16 bpp as well.
This commit is contained in:
Guus Sliepen 2012-03-09 16:08:31 +01:00
parent 6987eebd3d
commit a1b3da48c1
1 changed files with 27 additions and 4 deletions

View File

@ -89,10 +89,33 @@ void loadGameGraphics()
continue;
shipShape[i] = createSurface(shipShape[i - SHIP_HIT_INDEX]->w, shipShape[i- SHIP_HIT_INDEX]->h);
blit(shipShape[i - SHIP_HIT_INDEX], 0, 0, shipShape[i]);
uint32_t *p = (uint32_t *)shipShape[i]->pixels;
for(int j = 0; j < shipShape[i]->w * shipShape[i]->h; j++)
if(p[j])
p[j] |= shipShape[i]->format->Rmask;
switch(shipShape[i]->format->BytesPerPixel) {
case 4: {
uint32_t *p = (uint32_t *)shipShape[i]->pixels;
for (int j = 0; j < shipShape[i]->w * shipShape[i]->h; j++)
if (p[j])
p[j] |= shipShape[i]->format->Rmask;
break;
}
case 2: {
uint16_t *p = (uint16_t *)shipShape[i]->pixels;
for (int j = 0; j < shipShape[i]->w * shipShape[i]->h; j++)
if (p[j])
p[j] |= shipShape[i]->format->Rmask;
break;
}
case 1: {
uint8_t *p = (uint8_t *)shipShape[i]->pixels;
for (int j = 0; j < shipShape[i]->w * shipShape[i]->h; j++)
if (p[j])
p[j] = SDL_MapRGB(shipShape[i]->format, 255, 0, 0);
break;
}
}
SDL_SetColorKey(shipShape[i], (SDL_SRCCOLORKEY|SDL_RLEACCEL), SDL_MapRGB(shipShape[i]->format, 0, 0, 0));
}