/* * Windows BMP file definitions for OpenGL. * * Written by Michael Sweet. * * Modified by David Chelberg (minimal). * last-modified: Fri Oct 14 08:51:08 2005 * * * Modified by Chad Mourning( significant ) to use Boost memory mapping to make it more compatible with large files, and more object oriented * Dec-2011 */ #pragma once /* * Include necessary headers. */ # ifdef WIN32 # include # include # endif /* WIN32 */ #include namespace boost { namespace iostreams { class mapped_file_source; class mapped_file_sink; } } namespace Steamie { /* * Bitmap file data structures (these are defined in under * Windows...) * * Note that most Windows compilers will pack the following structures, so * when reading them under MacOS or UNIX we need to read individual fields * to avoid differences in alignment... */ # ifndef WIN32 typedef struct /**** BMP file header structure ****/ { unsigned short bfType; /* Magic number for file */ unsigned int bfSize; /* Size of file */ unsigned short bfReserved1; /* Reserved */ unsigned short bfReserved2; /* ... */ unsigned int bfOffBits; /* Offset to bitmap data */ } BITMAPFILEHEADER; # define BF_TYPE 0x4D42 /* "MB" */ typedef struct /**** BMP file info structure ****/ { unsigned int biSize; /* Size of info header */ int biWidth; /* Width of image */ int biHeight; /* Height of image */ unsigned short biPlanes; /* Number of color planes */ unsigned short biBitCount; /* Number of bits per pixel */ unsigned int biCompression; /* Type of compression to use */ unsigned int biSizeImage; /* Size of image data */ int biXPelsPerMeter; /* X pixels per meter */ int biYPelsPerMeter; /* Y pixels per meter */ unsigned int biClrUsed; /* Number of colors used */ unsigned int biClrImportant; /* Number of important colors */ } BITMAPINFOHEADER; /* * Constants for the biCompression field... */ # define BI_RGB 0 /* No compression - straight BGR data */ # define BI_RLE8 1 /* 8-bit run-length compression */ # define BI_RLE4 2 /* 4-bit run-length compression */ # define BI_BITFIELDS 3 /* RGB bitmap with RGB masks */ typedef struct /**** Colormap entry structure ****/ { unsigned char rgbBlue; /* Blue value */ unsigned char rgbGreen; /* Green value */ unsigned char rgbRed; /* Red value */ unsigned char rgbReserved; /* Reserved */ } RGBQUAD; typedef struct /**** Bitmap information structure ****/ { BITMAPINFOHEADER bmiHeader; /* Image header */ RGBQUAD bmiColors[256]; /* Image colormap */ } BITMAPINFO; # endif /* !WIN32 */ /* * Prototypes... */ class BitmapLoader { public: BitmapLoader(); ~BitmapLoader(); const char* openFile( std::string path, bool isMemMapped = false ); static int saveFile( std::string path, BITMAPINFO* info, const char* data ); BITMAPINFO* getInfo() { return infoOfOpenedFile; } protected: BITMAPINFO* infoOfOpenedFile; boost::iostreams::mapped_file_source* source; boost::iostreams::mapped_file_sink* sink; }; /* extern unsigned char *LoadDIBitmap(const char *filename, BITMAPINFO **info); extern int SaveDIBitmap(const char *filename, BITMAPINFO *info, unsigned char *bits); */ }