michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef MOZILLA_IMAGELIB_BMPHEADERS_H_ michael@0: #define MOZILLA_IMAGELIB_BMPHEADERS_H_ michael@0: michael@0: namespace mozilla { michael@0: namespace image { michael@0: michael@0: struct BMPFILEHEADER { michael@0: char signature[2]; // String "BM" michael@0: uint32_t filesize; michael@0: int32_t reserved; // Zero michael@0: uint32_t dataoffset; // Offset to raster data michael@0: michael@0: uint32_t bihsize; michael@0: }; michael@0: michael@0: // The length of the bitmap file header as defined in the BMP spec. michael@0: #define BFH_LENGTH 14 michael@0: // Internally we store the bitmap file header with an additional 4 bytes which michael@0: // is used to store the bitmap information header size. michael@0: #define BFH_INTERNAL_LENGTH 18 michael@0: michael@0: #define OS2_INTERNAL_BIH_LENGTH 8 michael@0: #define WIN_V3_INTERNAL_BIH_LENGTH 36 michael@0: #define WIN_V5_INTERNAL_BIH_LENGTH 120 michael@0: michael@0: #define OS2_BIH_LENGTH 12 // This is the real BIH size (as contained in the bihsize field of BMPFILEHEADER) michael@0: #define WIN_V3_BIH_LENGTH 40 // This is the real BIH size (as contained in the bihsize field of BMPFILEHEADER) michael@0: #define WIN_V5_BIH_LENGTH 124 // This is the real BIH size (as contained in the bihsize field of BMPFILEHEADER) michael@0: michael@0: #define OS2_HEADER_LENGTH (BFH_INTERNAL_LENGTH + OS2_INTERNAL_BIH_LENGTH) michael@0: #define WIN_V3_HEADER_LENGTH (BFH_INTERNAL_LENGTH + WIN_V3_INTERNAL_BIH_LENGTH) michael@0: #define WIN_V5_HEADER_LENGTH (BFH_INTERNAL_LENGTH + WIN_V5_INTERNAL_BIH_LENGTH) michael@0: michael@0: #ifndef LCS_sRGB michael@0: #define LCS_sRGB 0x73524742 michael@0: #endif michael@0: michael@0: struct xyz { michael@0: int32_t x, y, z; michael@0: }; michael@0: michael@0: struct xyzTriple { michael@0: xyz r, g, b; michael@0: }; michael@0: michael@0: struct BITMAPV5HEADER { michael@0: int32_t width; // Uint16 in OS/2 BMPs michael@0: int32_t height; // Uint16 in OS/2 BMPs michael@0: uint16_t planes; // =1 michael@0: uint16_t bpp; // Bits per pixel. michael@0: // The rest of the header is not available in OS/2 BMP Files michael@0: uint32_t compression; // 0=no compression 1=8bit RLE 2=4bit RLE michael@0: uint32_t image_size; // (compressed) image size. Can be 0 if compression==0 michael@0: uint32_t xppm; // Pixels per meter, horizontal michael@0: uint32_t yppm; // Pixels per meter, vertical michael@0: uint32_t colors; // Used Colors michael@0: uint32_t important_colors; // Number of important colors. 0=all michael@0: uint32_t red_mask; // Bits used for red component michael@0: uint32_t green_mask; // Bits used for green component michael@0: uint32_t blue_mask; // Bits used for blue component michael@0: uint32_t alpha_mask; // Bits used for alpha component michael@0: uint32_t color_space; // 0x73524742=LCS_sRGB ... michael@0: // These members are unused unless color_space == LCS_CALIBRATED_RGB michael@0: xyzTriple white_point; // Logical white point michael@0: uint32_t gamma_red; // Red gamma component michael@0: uint32_t gamma_green; // Green gamma component michael@0: uint32_t gamma_blue; // Blue gamma component michael@0: uint32_t intent; // Rendering intent michael@0: // These members are unused unless color_space == LCS_PROFILE_* michael@0: uint32_t profile_offset; // Offset to profile data in bytes michael@0: uint32_t profile_size; // Size of profile data in bytes michael@0: uint32_t reserved; // =0 michael@0: }; michael@0: michael@0: struct colorTable { michael@0: uint8_t red; michael@0: uint8_t green; michael@0: uint8_t blue; michael@0: }; michael@0: michael@0: struct bitFields { michael@0: uint32_t red; michael@0: uint32_t green; michael@0: uint32_t blue; michael@0: uint8_t redLeftShift; michael@0: uint8_t redRightShift; michael@0: uint8_t greenLeftShift; michael@0: uint8_t greenRightShift; michael@0: uint8_t blueLeftShift; michael@0: uint8_t blueRightShift; michael@0: }; michael@0: michael@0: } // namespace image michael@0: } // namespace mozilla michael@0: michael@0: #define BITFIELD_LENGTH 12 // Length of the bitfields structure in the bmp file michael@0: #define USE_RGB michael@0: michael@0: // BMPINFOHEADER.compression defines michael@0: #ifndef BI_RGB michael@0: #define BI_RGB 0 michael@0: #endif michael@0: #ifndef BI_RLE8 michael@0: #define BI_RLE8 1 michael@0: #endif michael@0: #ifndef BI_RLE4 michael@0: #define BI_RLE4 2 michael@0: #endif michael@0: #ifndef BI_BITFIELDS michael@0: #define BI_BITFIELDS 3 michael@0: #endif michael@0: // BI_ALPHABITFIELDS means no compression and specifies alpha bits michael@0: // valid only for 32bpp and 16bpp michael@0: #ifndef BI_ALPHABITFIELDS michael@0: #define BI_ALPHABITFIELDS 4 michael@0: #endif michael@0: michael@0: // RLE Escape codes michael@0: #define RLE_ESCAPE 0 michael@0: #define RLE_ESCAPE_EOL 0 michael@0: #define RLE_ESCAPE_EOF 1 michael@0: #define RLE_ESCAPE_DELTA 2 michael@0: michael@0: /// enums for mState michael@0: enum ERLEState { michael@0: eRLEStateInitial, michael@0: eRLEStateNeedSecondEscapeByte, michael@0: eRLEStateNeedXDelta, michael@0: eRLEStateNeedYDelta, ///< mStateData will hold x delta michael@0: eRLEStateAbsoluteMode, ///< mStateData will hold count of existing data to read michael@0: eRLEStateAbsoluteModePadded ///< As above, but another byte of data has to be read as padding michael@0: }; michael@0: michael@0: #endif