Mercurial > sdl-ios-xcode
diff src/video/SDL_bmp.c @ 1662:782fd950bd46 SDL-1.3
Revamp of the video system in progress - adding support for multiple displays, multiple windows, and a full video mode selection API.
WARNING: None of the video drivers have been updated for the new API yet! The API is still under design and very fluid.
The code is now run through a consistent indent format:
indent -i4 -nut -nsc -br -ce
The headers are being converted to automatically generate doxygen documentation.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sun, 28 May 2006 13:04:16 +0000 |
parents | d910939febfa |
children | 4da1ee79c9af |
line wrap: on
line diff
--- a/src/video/SDL_bmp.c Sun May 21 17:27:13 2006 +0000 +++ b/src/video/SDL_bmp.c Sun May 28 13:04:16 2006 +0000 @@ -45,476 +45,482 @@ #endif -SDL_Surface * SDL_LoadBMP_RW (SDL_RWops *src, int freesrc) +SDL_Surface * +SDL_LoadBMP_RW (SDL_RWops * src, int freesrc) { - int was_error; - long fp_offset; - int bmpPitch; - int i, pad; - SDL_Surface *surface; - Uint32 Rmask; - Uint32 Gmask; - Uint32 Bmask; - SDL_Palette *palette; - Uint8 *bits; - int ExpandBMP; + int was_error; + long fp_offset; + int bmpPitch; + int i, pad; + SDL_Surface *surface; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + SDL_Palette *palette; + Uint8 *bits; + int ExpandBMP; - /* The Win32 BMP file header (14 bytes) */ - char magic[2]; - Uint32 bfSize; - Uint16 bfReserved1; - Uint16 bfReserved2; - Uint32 bfOffBits; + /* The Win32 BMP file header (14 bytes) */ + char magic[2]; + Uint32 bfSize; + Uint16 bfReserved1; + Uint16 bfReserved2; + Uint32 bfOffBits; - /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ - Uint32 biSize; - Sint32 biWidth; - Sint32 biHeight; - Uint16 biPlanes; - Uint16 biBitCount; - Uint32 biCompression; - Uint32 biSizeImage; - Sint32 biXPelsPerMeter; - Sint32 biYPelsPerMeter; - Uint32 biClrUsed; - Uint32 biClrImportant; + /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ + Uint32 biSize; + Sint32 biWidth; + Sint32 biHeight; + Uint16 biPlanes; + Uint16 biBitCount; + Uint32 biCompression; + Uint32 biSizeImage; + Sint32 biXPelsPerMeter; + Sint32 biYPelsPerMeter; + Uint32 biClrUsed; + Uint32 biClrImportant; - /* Make sure we are passed a valid data source */ - surface = NULL; - was_error = 0; - if ( src == NULL ) { - was_error = 1; - goto done; - } + /* Make sure we are passed a valid data source */ + surface = NULL; + was_error = 0; + if (src == NULL) { + was_error = 1; + goto done; + } - /* Read in the BMP file header */ - fp_offset = SDL_RWtell(src); - SDL_ClearError(); - if ( SDL_RWread(src, magic, 1, 2) != 2 ) { - SDL_Error(SDL_EFREAD); - was_error = 1; - goto done; - } - if ( SDL_strncmp(magic, "BM", 2) != 0 ) { - SDL_SetError("File is not a Windows BMP file"); - was_error = 1; - goto done; - } - bfSize = SDL_ReadLE32(src); - bfReserved1 = SDL_ReadLE16(src); - bfReserved2 = SDL_ReadLE16(src); - bfOffBits = SDL_ReadLE32(src); + /* Read in the BMP file header */ + fp_offset = SDL_RWtell (src); + SDL_ClearError (); + if (SDL_RWread (src, magic, 1, 2) != 2) { + SDL_Error (SDL_EFREAD); + was_error = 1; + goto done; + } + if (SDL_strncmp (magic, "BM", 2) != 0) { + SDL_SetError ("File is not a Windows BMP file"); + was_error = 1; + goto done; + } + bfSize = SDL_ReadLE32 (src); + bfReserved1 = SDL_ReadLE16 (src); + bfReserved2 = SDL_ReadLE16 (src); + bfOffBits = SDL_ReadLE32 (src); - /* Read the Win32 BITMAPINFOHEADER */ - biSize = SDL_ReadLE32(src); - if ( biSize == 12 ) { - biWidth = (Uint32)SDL_ReadLE16(src); - biHeight = (Uint32)SDL_ReadLE16(src); - biPlanes = SDL_ReadLE16(src); - biBitCount = SDL_ReadLE16(src); - biCompression = BI_RGB; - biSizeImage = 0; - biXPelsPerMeter = 0; - biYPelsPerMeter = 0; - biClrUsed = 0; - biClrImportant = 0; - } else { - biWidth = SDL_ReadLE32(src); - biHeight = SDL_ReadLE32(src); - biPlanes = SDL_ReadLE16(src); - biBitCount = SDL_ReadLE16(src); - biCompression = SDL_ReadLE32(src); - biSizeImage = SDL_ReadLE32(src); - biXPelsPerMeter = SDL_ReadLE32(src); - biYPelsPerMeter = SDL_ReadLE32(src); - biClrUsed = SDL_ReadLE32(src); - biClrImportant = SDL_ReadLE32(src); - } + /* Read the Win32 BITMAPINFOHEADER */ + biSize = SDL_ReadLE32 (src); + if (biSize == 12) { + biWidth = (Uint32) SDL_ReadLE16 (src); + biHeight = (Uint32) SDL_ReadLE16 (src); + biPlanes = SDL_ReadLE16 (src); + biBitCount = SDL_ReadLE16 (src); + biCompression = BI_RGB; + biSizeImage = 0; + biXPelsPerMeter = 0; + biYPelsPerMeter = 0; + biClrUsed = 0; + biClrImportant = 0; + } else { + biWidth = SDL_ReadLE32 (src); + biHeight = SDL_ReadLE32 (src); + biPlanes = SDL_ReadLE16 (src); + biBitCount = SDL_ReadLE16 (src); + biCompression = SDL_ReadLE32 (src); + biSizeImage = SDL_ReadLE32 (src); + biXPelsPerMeter = SDL_ReadLE32 (src); + biYPelsPerMeter = SDL_ReadLE32 (src); + biClrUsed = SDL_ReadLE32 (src); + biClrImportant = SDL_ReadLE32 (src); + } - /* Check for read error */ - if ( SDL_strcmp(SDL_GetError(), "") != 0 ) { - was_error = 1; - goto done; - } + /* Check for read error */ + if (SDL_strcmp (SDL_GetError (), "") != 0) { + was_error = 1; + goto done; + } - /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */ - switch (biBitCount) { - case 1: - case 4: - ExpandBMP = biBitCount; - biBitCount = 8; - break; - default: - ExpandBMP = 0; - break; - } + /* Expand 1 and 4 bit bitmaps to 8 bits per pixel */ + switch (biBitCount) { + case 1: + case 4: + ExpandBMP = biBitCount; + biBitCount = 8; + break; + default: + ExpandBMP = 0; + break; + } - /* We don't support any BMP compression right now */ - Rmask = Gmask = Bmask = 0; - switch (biCompression) { - case BI_RGB: - /* If there are no masks, use the defaults */ - if ( bfOffBits == (14+biSize) ) { - /* Default values for the BMP format */ - switch (biBitCount) { - case 15: - case 16: - Rmask = 0x7C00; - Gmask = 0x03E0; - Bmask = 0x001F; - break; - case 24: + /* We don't support any BMP compression right now */ + Rmask = Gmask = Bmask = 0; + switch (biCompression) { + case BI_RGB: + /* If there are no masks, use the defaults */ + if (bfOffBits == (14 + biSize)) { + /* Default values for the BMP format */ + switch (biBitCount) { + case 15: + case 16: + Rmask = 0x7C00; + Gmask = 0x03E0; + Bmask = 0x001F; + break; + case 24: #if SDL_BYTEORDER == SDL_BIG_ENDIAN - Rmask = 0x000000FF; - Gmask = 0x0000FF00; - Bmask = 0x00FF0000; - break; + Rmask = 0x000000FF; + Gmask = 0x0000FF00; + Bmask = 0x00FF0000; + break; #endif - case 32: - Rmask = 0x00FF0000; - Gmask = 0x0000FF00; - Bmask = 0x000000FF; - break; - default: - break; - } - break; - } - /* Fall through -- read the RGB masks */ + case 32: + Rmask = 0x00FF0000; + Gmask = 0x0000FF00; + Bmask = 0x000000FF; + break; + default: + break; + } + break; + } + /* Fall through -- read the RGB masks */ - case BI_BITFIELDS: - switch (biBitCount) { - case 15: - case 16: - case 32: - Rmask = SDL_ReadLE32(src); - Gmask = SDL_ReadLE32(src); - Bmask = SDL_ReadLE32(src); - break; - default: - break; - } - break; - default: - SDL_SetError("Compressed BMP files not supported"); - was_error = 1; - goto done; - } + case BI_BITFIELDS: + switch (biBitCount) { + case 15: + case 16: + case 32: + Rmask = SDL_ReadLE32 (src); + Gmask = SDL_ReadLE32 (src); + Bmask = SDL_ReadLE32 (src); + break; + default: + break; + } + break; + default: + SDL_SetError ("Compressed BMP files not supported"); + was_error = 1; + goto done; + } - /* Create a compatible surface, note that the colors are RGB ordered */ - surface = SDL_CreateRGBSurface(SDL_SWSURFACE, - biWidth, biHeight, biBitCount, Rmask, Gmask, Bmask, 0); - if ( surface == NULL ) { - was_error = 1; - goto done; - } + /* Create a compatible surface, note that the colors are RGB ordered */ + surface = SDL_CreateRGBSurface (SDL_SWSURFACE, + biWidth, biHeight, biBitCount, Rmask, + Gmask, Bmask, 0); + if (surface == NULL) { + was_error = 1; + goto done; + } - /* Load the palette, if any */ - palette = (surface->format)->palette; - if ( palette ) { - if ( biClrUsed == 0 ) { - biClrUsed = 1 << biBitCount; - } - if ( biSize == 12 ) { - for ( i = 0; i < (int)biClrUsed; ++i ) { - SDL_RWread(src, &palette->colors[i].b, 1, 1); - SDL_RWread(src, &palette->colors[i].g, 1, 1); - SDL_RWread(src, &palette->colors[i].r, 1, 1); - palette->colors[i].unused = 0; - } - } else { - for ( i = 0; i < (int)biClrUsed; ++i ) { - SDL_RWread(src, &palette->colors[i].b, 1, 1); - SDL_RWread(src, &palette->colors[i].g, 1, 1); - SDL_RWread(src, &palette->colors[i].r, 1, 1); - SDL_RWread(src, &palette->colors[i].unused, 1, 1); - } - } - palette->ncolors = biClrUsed; - } + /* Load the palette, if any */ + palette = (surface->format)->palette; + if (palette) { + if (biClrUsed == 0) { + biClrUsed = 1 << biBitCount; + } + if (biSize == 12) { + for (i = 0; i < (int) biClrUsed; ++i) { + SDL_RWread (src, &palette->colors[i].b, 1, 1); + SDL_RWread (src, &palette->colors[i].g, 1, 1); + SDL_RWread (src, &palette->colors[i].r, 1, 1); + palette->colors[i].unused = 0; + } + } else { + for (i = 0; i < (int) biClrUsed; ++i) { + SDL_RWread (src, &palette->colors[i].b, 1, 1); + SDL_RWread (src, &palette->colors[i].g, 1, 1); + SDL_RWread (src, &palette->colors[i].r, 1, 1); + SDL_RWread (src, &palette->colors[i].unused, 1, 1); + } + } + palette->ncolors = biClrUsed; + } - /* Read the surface pixels. Note that the bmp image is upside down */ - if ( SDL_RWseek(src, fp_offset+bfOffBits, RW_SEEK_SET) < 0 ) { - SDL_Error(SDL_EFSEEK); - was_error = 1; - goto done; - } - bits = (Uint8 *)surface->pixels+(surface->h*surface->pitch); - switch (ExpandBMP) { - case 1: - bmpPitch = (biWidth + 7) >> 3; - pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0); - break; - case 4: - bmpPitch = (biWidth + 1) >> 1; - pad = (((bmpPitch)%4) ? (4-((bmpPitch)%4)) : 0); - break; - default: - pad = ((surface->pitch%4) ? - (4-(surface->pitch%4)) : 0); - break; - } - while ( bits > (Uint8 *)surface->pixels ) { - bits -= surface->pitch; - switch (ExpandBMP) { - case 1: - case 4: { - Uint8 pixel = 0; - int shift = (8-ExpandBMP); - for ( i=0; i<surface->w; ++i ) { - if ( i%(8/ExpandBMP) == 0 ) { - if ( !SDL_RWread(src, &pixel, 1, 1) ) { - SDL_SetError( - "Error reading from BMP"); - was_error = 1; - goto done; - } - } - *(bits+i) = (pixel>>shift); - pixel <<= ExpandBMP; - } } - break; + /* Read the surface pixels. Note that the bmp image is upside down */ + if (SDL_RWseek (src, fp_offset + bfOffBits, RW_SEEK_SET) < 0) { + SDL_Error (SDL_EFSEEK); + was_error = 1; + goto done; + } + bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch); + switch (ExpandBMP) { + case 1: + bmpPitch = (biWidth + 7) >> 3; + pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0); + break; + case 4: + bmpPitch = (biWidth + 1) >> 1; + pad = (((bmpPitch) % 4) ? (4 - ((bmpPitch) % 4)) : 0); + break; + default: + pad = ((surface->pitch % 4) ? (4 - (surface->pitch % 4)) : 0); + break; + } + while (bits > (Uint8 *) surface->pixels) { + bits -= surface->pitch; + switch (ExpandBMP) { + case 1: + case 4: + { + Uint8 pixel = 0; + int shift = (8 - ExpandBMP); + for (i = 0; i < surface->w; ++i) { + if (i % (8 / ExpandBMP) == 0) { + if (!SDL_RWread (src, &pixel, 1, 1)) { + SDL_SetError ("Error reading from BMP"); + was_error = 1; + goto done; + } + } + *(bits + i) = (pixel >> shift); + pixel <<= ExpandBMP; + } + } + break; - default: - if ( SDL_RWread(src, bits, 1, surface->pitch) - != surface->pitch ) { - SDL_Error(SDL_EFREAD); - was_error = 1; - goto done; - } + default: + if (SDL_RWread (src, bits, 1, surface->pitch) + != surface->pitch) { + SDL_Error (SDL_EFREAD); + was_error = 1; + goto done; + } #if SDL_BYTEORDER == SDL_BIG_ENDIAN - /* Byte-swap the pixels if needed. Note that the 24bpp - case has already been taken care of above. */ - switch(biBitCount) { - case 15: - case 16: { - Uint16 *pix = (Uint16 *)bits; - for(i = 0; i < surface->w; i++) - pix[i] = SDL_Swap16(pix[i]); - break; - } + /* Byte-swap the pixels if needed. Note that the 24bpp + case has already been taken care of above. */ + switch (biBitCount) { + case 15: + case 16: + { + Uint16 *pix = (Uint16 *) bits; + for (i = 0; i < surface->w; i++) + pix[i] = SDL_Swap16 (pix[i]); + break; + } - case 32: { - Uint32 *pix = (Uint32 *)bits; - for(i = 0; i < surface->w; i++) - pix[i] = SDL_Swap32(pix[i]); - break; - } - } + case 32: + { + Uint32 *pix = (Uint32 *) bits; + for (i = 0; i < surface->w; i++) + pix[i] = SDL_Swap32 (pix[i]); + break; + } + } #endif - break; - } - /* Skip padding bytes, ugh */ - if ( pad ) { - Uint8 padbyte; - for ( i=0; i<pad; ++i ) { - SDL_RWread(src, &padbyte, 1, 1); - } - } - } -done: - if ( was_error ) { - if ( src ) { - SDL_RWseek(src, fp_offset, RW_SEEK_SET); - } - if ( surface ) { - SDL_FreeSurface(surface); - } - surface = NULL; - } - if ( freesrc && src ) { - SDL_RWclose(src); - } - return(surface); + break; + } + /* Skip padding bytes, ugh */ + if (pad) { + Uint8 padbyte; + for (i = 0; i < pad; ++i) { + SDL_RWread (src, &padbyte, 1, 1); + } + } + } + done: + if (was_error) { + if (src) { + SDL_RWseek (src, fp_offset, RW_SEEK_SET); + } + if (surface) { + SDL_FreeSurface (surface); + } + surface = NULL; + } + if (freesrc && src) { + SDL_RWclose (src); + } + return (surface); } -int SDL_SaveBMP_RW (SDL_Surface *saveme, SDL_RWops *dst, int freedst) +int +SDL_SaveBMP_RW (SDL_Surface * saveme, SDL_RWops * dst, int freedst) { - long fp_offset; - int i, pad; - SDL_Surface *surface; - Uint8 *bits; + long fp_offset; + int i, pad; + SDL_Surface *surface; + Uint8 *bits; - /* The Win32 BMP file header (14 bytes) */ - char magic[2] = { 'B', 'M' }; - Uint32 bfSize; - Uint16 bfReserved1; - Uint16 bfReserved2; - Uint32 bfOffBits; + /* The Win32 BMP file header (14 bytes) */ + char magic[2] = { 'B', 'M' }; + Uint32 bfSize; + Uint16 bfReserved1; + Uint16 bfReserved2; + Uint32 bfOffBits; - /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ - Uint32 biSize; - Sint32 biWidth; - Sint32 biHeight; - Uint16 biPlanes; - Uint16 biBitCount; - Uint32 biCompression; - Uint32 biSizeImage; - Sint32 biXPelsPerMeter; - Sint32 biYPelsPerMeter; - Uint32 biClrUsed; - Uint32 biClrImportant; + /* The Win32 BITMAPINFOHEADER struct (40 bytes) */ + Uint32 biSize; + Sint32 biWidth; + Sint32 biHeight; + Uint16 biPlanes; + Uint16 biBitCount; + Uint32 biCompression; + Uint32 biSizeImage; + Sint32 biXPelsPerMeter; + Sint32 biYPelsPerMeter; + Uint32 biClrUsed; + Uint32 biClrImportant; - /* Make sure we have somewhere to save */ - surface = NULL; - if ( dst ) { - if ( saveme->format->palette ) { - if ( saveme->format->BitsPerPixel == 8 ) { - surface = saveme; - } else { - SDL_SetError("%d bpp BMP files not supported", - saveme->format->BitsPerPixel); - } - } - else if ( (saveme->format->BitsPerPixel == 24) && + /* Make sure we have somewhere to save */ + surface = NULL; + if (dst) { + if (saveme->format->palette) { + if (saveme->format->BitsPerPixel == 8) { + surface = saveme; + } else { + SDL_SetError ("%d bpp BMP files not supported", + saveme->format->BitsPerPixel); + } + } else if ((saveme->format->BitsPerPixel == 24) && #if SDL_BYTEORDER == SDL_LIL_ENDIAN - (saveme->format->Rmask == 0x00FF0000) && - (saveme->format->Gmask == 0x0000FF00) && - (saveme->format->Bmask == 0x000000FF) + (saveme->format->Rmask == 0x00FF0000) && + (saveme->format->Gmask == 0x0000FF00) && + (saveme->format->Bmask == 0x000000FF) #else - (saveme->format->Rmask == 0x000000FF) && - (saveme->format->Gmask == 0x0000FF00) && - (saveme->format->Bmask == 0x00FF0000) + (saveme->format->Rmask == 0x000000FF) && + (saveme->format->Gmask == 0x0000FF00) && + (saveme->format->Bmask == 0x00FF0000) #endif - ) { - surface = saveme; - } else { - SDL_Rect bounds; + ) { + surface = saveme; + } else { + SDL_Rect bounds; - /* Convert to 24 bits per pixel */ - surface = SDL_CreateRGBSurface(SDL_SWSURFACE, - saveme->w, saveme->h, 24, + /* Convert to 24 bits per pixel */ + surface = SDL_CreateRGBSurface (SDL_SWSURFACE, + saveme->w, saveme->h, 24, #if SDL_BYTEORDER == SDL_LIL_ENDIAN - 0x00FF0000, 0x0000FF00, 0x000000FF, + 0x00FF0000, 0x0000FF00, + 0x000000FF, #else - 0x000000FF, 0x0000FF00, 0x00FF0000, + 0x000000FF, 0x0000FF00, + 0x00FF0000, #endif - 0); - if ( surface != NULL ) { - bounds.x = 0; - bounds.y = 0; - bounds.w = saveme->w; - bounds.h = saveme->h; - if ( SDL_LowerBlit(saveme, &bounds, surface, - &bounds) < 0 ) { - SDL_FreeSurface(surface); - SDL_SetError( - "Couldn't convert image to 24 bpp"); - surface = NULL; - } - } - } - } + 0); + if (surface != NULL) { + bounds.x = 0; + bounds.y = 0; + bounds.w = saveme->w; + bounds.h = saveme->h; + if (SDL_LowerBlit (saveme, &bounds, surface, &bounds) < 0) { + SDL_FreeSurface (surface); + SDL_SetError ("Couldn't convert image to 24 bpp"); + surface = NULL; + } + } + } + } - if ( surface && (SDL_LockSurface(surface) == 0) ) { - const int bw = surface->w*surface->format->BytesPerPixel; + if (surface && (SDL_LockSurface (surface) == 0)) { + const int bw = surface->w * surface->format->BytesPerPixel; + + /* Set the BMP file header values */ + bfSize = 0; /* We'll write this when we're done */ + bfReserved1 = 0; + bfReserved2 = 0; + bfOffBits = 0; /* We'll write this when we're done */ - /* Set the BMP file header values */ - bfSize = 0; /* We'll write this when we're done */ - bfReserved1 = 0; - bfReserved2 = 0; - bfOffBits = 0; /* We'll write this when we're done */ + /* Write the BMP file header values */ + fp_offset = SDL_RWtell (dst); + SDL_ClearError (); + SDL_RWwrite (dst, magic, 2, 1); + SDL_WriteLE32 (dst, bfSize); + SDL_WriteLE16 (dst, bfReserved1); + SDL_WriteLE16 (dst, bfReserved2); + SDL_WriteLE32 (dst, bfOffBits); - /* Write the BMP file header values */ - fp_offset = SDL_RWtell(dst); - SDL_ClearError(); - SDL_RWwrite(dst, magic, 2, 1); - SDL_WriteLE32(dst, bfSize); - SDL_WriteLE16(dst, bfReserved1); - SDL_WriteLE16(dst, bfReserved2); - SDL_WriteLE32(dst, bfOffBits); + /* Set the BMP info values */ + biSize = 40; + biWidth = surface->w; + biHeight = surface->h; + biPlanes = 1; + biBitCount = surface->format->BitsPerPixel; + biCompression = BI_RGB; + biSizeImage = surface->h * surface->pitch; + biXPelsPerMeter = 0; + biYPelsPerMeter = 0; + if (surface->format->palette) { + biClrUsed = surface->format->palette->ncolors; + } else { + biClrUsed = 0; + } + biClrImportant = 0; - /* Set the BMP info values */ - biSize = 40; - biWidth = surface->w; - biHeight = surface->h; - biPlanes = 1; - biBitCount = surface->format->BitsPerPixel; - biCompression = BI_RGB; - biSizeImage = surface->h*surface->pitch; - biXPelsPerMeter = 0; - biYPelsPerMeter = 0; - if ( surface->format->palette ) { - biClrUsed = surface->format->palette->ncolors; - } else { - biClrUsed = 0; - } - biClrImportant = 0; + /* Write the BMP info values */ + SDL_WriteLE32 (dst, biSize); + SDL_WriteLE32 (dst, biWidth); + SDL_WriteLE32 (dst, biHeight); + SDL_WriteLE16 (dst, biPlanes); + SDL_WriteLE16 (dst, biBitCount); + SDL_WriteLE32 (dst, biCompression); + SDL_WriteLE32 (dst, biSizeImage); + SDL_WriteLE32 (dst, biXPelsPerMeter); + SDL_WriteLE32 (dst, biYPelsPerMeter); + SDL_WriteLE32 (dst, biClrUsed); + SDL_WriteLE32 (dst, biClrImportant); - /* Write the BMP info values */ - SDL_WriteLE32(dst, biSize); - SDL_WriteLE32(dst, biWidth); - SDL_WriteLE32(dst, biHeight); - SDL_WriteLE16(dst, biPlanes); - SDL_WriteLE16(dst, biBitCount); - SDL_WriteLE32(dst, biCompression); - SDL_WriteLE32(dst, biSizeImage); - SDL_WriteLE32(dst, biXPelsPerMeter); - SDL_WriteLE32(dst, biYPelsPerMeter); - SDL_WriteLE32(dst, biClrUsed); - SDL_WriteLE32(dst, biClrImportant); + /* Write the palette (in BGR color order) */ + if (surface->format->palette) { + SDL_Color *colors; + int ncolors; - /* Write the palette (in BGR color order) */ - if ( surface->format->palette ) { - SDL_Color *colors; - int ncolors; + colors = surface->format->palette->colors; + ncolors = surface->format->palette->ncolors; + for (i = 0; i < ncolors; ++i) { + SDL_RWwrite (dst, &colors[i].b, 1, 1); + SDL_RWwrite (dst, &colors[i].g, 1, 1); + SDL_RWwrite (dst, &colors[i].r, 1, 1); + SDL_RWwrite (dst, &colors[i].unused, 1, 1); + } + } - colors = surface->format->palette->colors; - ncolors = surface->format->palette->ncolors; - for ( i=0; i<ncolors; ++i ) { - SDL_RWwrite(dst, &colors[i].b, 1, 1); - SDL_RWwrite(dst, &colors[i].g, 1, 1); - SDL_RWwrite(dst, &colors[i].r, 1, 1); - SDL_RWwrite(dst, &colors[i].unused, 1, 1); - } - } - - /* Write the bitmap offset */ - bfOffBits = SDL_RWtell(dst)-fp_offset; - if ( SDL_RWseek(dst, fp_offset+10, RW_SEEK_SET) < 0 ) { - SDL_Error(SDL_EFSEEK); - } - SDL_WriteLE32(dst, bfOffBits); - if ( SDL_RWseek(dst, fp_offset+bfOffBits, RW_SEEK_SET) < 0 ) { - SDL_Error(SDL_EFSEEK); - } + /* Write the bitmap offset */ + bfOffBits = SDL_RWtell (dst) - fp_offset; + if (SDL_RWseek (dst, fp_offset + 10, RW_SEEK_SET) < 0) { + SDL_Error (SDL_EFSEEK); + } + SDL_WriteLE32 (dst, bfOffBits); + if (SDL_RWseek (dst, fp_offset + bfOffBits, RW_SEEK_SET) < 0) { + SDL_Error (SDL_EFSEEK); + } - /* Write the bitmap image upside down */ - bits = (Uint8 *)surface->pixels+(surface->h*surface->pitch); - pad = ((bw%4) ? (4-(bw%4)) : 0); - while ( bits > (Uint8 *)surface->pixels ) { - bits -= surface->pitch; - if ( SDL_RWwrite(dst, bits, 1, bw) != bw) { - SDL_Error(SDL_EFWRITE); - break; - } - if ( pad ) { - const Uint8 padbyte = 0; - for ( i=0; i<pad; ++i ) { - SDL_RWwrite(dst, &padbyte, 1, 1); - } - } - } + /* Write the bitmap image upside down */ + bits = (Uint8 *) surface->pixels + (surface->h * surface->pitch); + pad = ((bw % 4) ? (4 - (bw % 4)) : 0); + while (bits > (Uint8 *) surface->pixels) { + bits -= surface->pitch; + if (SDL_RWwrite (dst, bits, 1, bw) != bw) { + SDL_Error (SDL_EFWRITE); + break; + } + if (pad) { + const Uint8 padbyte = 0; + for (i = 0; i < pad; ++i) { + SDL_RWwrite (dst, &padbyte, 1, 1); + } + } + } - /* Write the BMP file size */ - bfSize = SDL_RWtell(dst)-fp_offset; - if ( SDL_RWseek(dst, fp_offset+2, RW_SEEK_SET) < 0 ) { - SDL_Error(SDL_EFSEEK); - } - SDL_WriteLE32(dst, bfSize); - if ( SDL_RWseek(dst, fp_offset+bfSize, RW_SEEK_SET) < 0 ) { - SDL_Error(SDL_EFSEEK); - } + /* Write the BMP file size */ + bfSize = SDL_RWtell (dst) - fp_offset; + if (SDL_RWseek (dst, fp_offset + 2, RW_SEEK_SET) < 0) { + SDL_Error (SDL_EFSEEK); + } + SDL_WriteLE32 (dst, bfSize); + if (SDL_RWseek (dst, fp_offset + bfSize, RW_SEEK_SET) < 0) { + SDL_Error (SDL_EFSEEK); + } - /* Close it up.. */ - SDL_UnlockSurface(surface); - if ( surface != saveme ) { - SDL_FreeSurface(surface); - } - } + /* Close it up.. */ + SDL_UnlockSurface (surface); + if (surface != saveme) { + SDL_FreeSurface (surface); + } + } - if ( freedst && dst ) { - SDL_RWclose(dst); - } - return((SDL_strcmp(SDL_GetError(), "") == 0) ? 0 : -1); + if (freedst && dst) { + SDL_RWclose (dst); + } + return ((SDL_strcmp (SDL_GetError (), "") == 0) ? 0 : -1); } + +/* vi: set ts=4 sw=4 expandtab: */