Download | Plain Text | Line Numbers
/**
* @module cwindowsbitmap
* @author Guenther Neuwirth (0626638), Manuel Mausz (0728348)
* @brief Implementation of CBitmap handling Windows Bitmaps.
* @date 17.04.2009
*/
#ifndef CWINDOWSBITMAP_H
#define CWINDOWSBITMAP_H
#include <stdint.h>
#include "cbitmap.h"
/**
* @class CWindowsBitmap
* @brief Implementation of CBitmap handling Windows Bitmaps.
*
* On error CFile::FileError is thrown.
*/
class CWindowsBitmap : public CBitmap
{
public:
/**
* @method CWindowsBitmap
* @brief Default ctor
* @param -
* @return -
* @globalvars none
* @exception none
* @conditions none
*/
CWindowsBitmap();
/**
* @method ~CWindowsBitmap
* @brief Default dtor
* @param -
* @return -
* @globalvars none
* @exception none
* @conditions none
*/
~CWindowsBitmap()
{}
/**
* @method read
* @brief Reads Windows Bitmap from filestream.
* On error an exception is thrown.
* @param in filestream to read data from
* @return -
* @globalvars none
* @exception CFile::FileError
* @exception bad_alloc
* @conditions none
*/
void read(std::ifstream& in);
/**
* @method write
* @brief Writes Windows Bitmap to filestream.
* @param out filestream to read data from
* @return -
* @globalvars none
* @exception FileError
* @exception bad_alloc
* @conditions none
*/
void write(std::ofstream& out);
#ifdef DEBUG
/**
* @method dump
* @brief Dumps the Windows Bitmap file headers to ostream
* @param out output stream
* @return -
* @globalvars
* @exception
* @conditions
*/
void dump(std::ostream& out);
#endif
/**
* @method getPixelDataSize
* @brief Return size of pixelbuffer
* @param -
* @return size of pixelbuffer
* @globalvars none
* @exception none
* @conditions none
*/
const uint32_t getPixelDataSize()
{
return m_infoheader.biSizeImage;
}
/**
* @method getHeight
* @brief Return height of bitmap in pixel
* @param -
* @return height of bitmap in pixel
* @globalvars none
* @exception none
* @conditions none
*/
const uint32_t getHeight()
{
/* width and height can be negativ */
return static_cast<uint32_t>(abs(m_infoheader.biHeight));
}
/**
* @method getWidth
* @brief Return width of bitmap in pixel
* @param -
* @return width of bitmap in pixel
* @globalvars none
* @exception none
* @conditions none
*/
const uint32_t getWidth()
{
/* width and height can be negativ */
return static_cast<uint32_t>(abs(m_infoheader.biWidth));
}
/**
* @method isMirrored
* @brief Windows Bitmaps can be stored upside down
* @param -
* @return true if bitmap is stored upside down. false otherwise
* @globalvars none
* @exception none
* @conditions none
*/
const bool isMirrored()
{
/* if height is positive the y-coordinates are mirrored */
return (m_infoheader.biHeight > 0) ? true : false;
}
/**
* @method hasColorTable
* @brief Check if bitmap has a colortable
* (we don't support this yet for windows bitmaps)
* @param -
* @return true if bitmap has a colortable. false otherwise
* @globalvars none
* @exception none
* @conditions none
*/
const bool hasColorTable()
{
return false;
}
protected:
/**
* @brief Windows Bitmap File Header structure
*/
#pragma pack(push,1)
typedef struct
{
/** the magic number used to identify the BMP file */
uint8_t bfType[2];
/** the size of the BMP file in bytes */
uint32_t bfSize;
/** reserved */
uint32_t bfReserved;
/** the offset of the byte where the bitmap data can be found */
uint32_t bfOffBits;
} BITMAP_FILEHEADER;
#pragma pack(pop)
/**
* @brief Windows Bitmap Info Header structure
*/
#pragma pack(push,1)
typedef struct
{
/** the size of this header (40 bytes) */
uint32_t biSize;
/** the bitmap width in pixels (signed integer) */
int32_t biWidth;
/** the bitmap height in pixels (signed integer) */
int32_t biHeight;
/** the number of color planes being used. Must be set to 1 */
uint16_t biPlanes;
/** the number of bits per pixel, which is the color depth of the image */
uint16_t biBitCount;
/** the compression method being used */
uint32_t biCompression;
/** the image size */
uint32_t biSizeImage;
/** the horizontal resolution of the image (pixel per meter) */
int32_t biXPelsPerMeter;
/** the vertical resolution of the image (pixel per meter) */
int32_t biYPelsPerMeter;
/** the number of colors in the color palette, or 0 to default to 2^n */
uint32_t biClrUsed;
/** the number of important colors used, or 0 when every color is
* important; generally ignored. */
uint32_t biClrImportant;
} BITMAP_INFOHEADER;
#pragma pack(pop)
/* members */
/** fileheader */
BITMAP_FILEHEADER m_fileheader;
/** infoheader */
BITMAP_INFOHEADER m_infoheader;
};
#endif
/* vim: set et sw=2 ts=2: */