#ifndef _COMMON_BITMAP_HPP_ #define _COMMON_BITMAP_HPP_ #include #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_TYPES_HPP_ #include #endif #ifndef _COMMON_STRING_HPP_ #include #endif #ifndef _COMMON_BITMAPDATA_HPP_ #include #endif #ifndef _COMMON_PUREPALETTE_HPP_ #include #endif #ifndef _COMMON_GLOBALDATA_HPP_ #include #endif #ifndef _COMMON_BITMAPINFO_HPP_ #include #endif #ifndef _COMMON_BITMAPOVERLAY_HPP_ #include #endif class MemFile; class Bitmap : public BitmapData { public: enum {MaxColors=256,BitCount=8,Planes=1}; Bitmap(void); Bitmap(const Bitmap &someBitmap); Bitmap(const String &pathFileName); Bitmap(const String &pathFileName,HGLOBAL hGlobalImage,HGLOBAL hGlobalBitmapInfo); Bitmap(const String &pathFileName,WORD bitmapWidth,WORD bitmapHeight,WORD bitmapColors=MaxColors,WORD bitCount=BitCount); Bitmap(const String &pathFileName,BitmapInfo &infoData,GlobalData &imageData); ~Bitmap(); Bitmap &rotateRight(void); Bitmap &rotateLeft(void); WORD operator=(const String &pathFileName); Bitmap &operator=(const Bitmap &someBitmap); WORD operator+=(const BitmapOverlay &someBitmapOverlay); WORD operator==(const Bitmap &someBitmap)const; WORD width(void)const; WORD height(void)const; WORD planes(void)const; WORD bitCount(void)const; DWORD getImageExtent(void)const; void setByte(WORD row,WORD col,BYTE byteValue); BYTE getByte(WORD row,WORD col)const; WORD getRow(WORD row,char FAR *lpRowData); WORD setRow(WORD row,char FAR *lpRowData); WORD getCol(WORD col,char FAR *lpColData); WORD setCol(WORD col,char FAR *lpColData); void setBits(BYTE byteValue); WORD displayBitmap(HWND hDisplayWindow,HDC hDC=(HDC)0,int isActive=FALSE,int conforming=FALSE)const; BOOL draw(PureDevice &pureDevice,const Rect &dstRect,const Point &srcPoint); bool saveBitmap(void); bool saveBitmap(MemFile &memFile); bool saveBitmap(const String &pathFileName); HBITMAP createBitmap(PureDevice &somePureDevice); WORD setPalette(HPALETTE hPalette,WORD remapBitmap=TRUE); HPALETTE getPalette(void)const; BOOL isValidBitmap(const String &pathFileName)const; WORD isOkay(void)const; void *ptrData(void); void upsideDown(void); HGLOBAL lockedImageData(void)const; HGLOBAL lockedBitmapInfo(void)const; private: enum Mode{Read,Write,Idle}; enum {Signature=0x4D42}; void mapPalette(PurePalette &purePalette); void closeFile(void); void readPalette(void); void setPalette(void); void decodeImage(void); void getRequiredWidth(WORD &desiredWidth,WORD desiredHeight); void getRequiredWidth(DWORD &desiredWidth,DWORD desiredHeight); void copyBitmap(const Bitmap &someBitmap); void copyBits(UHUGE *destination,UHUGE *source,unsigned long length)const; void setBits(UHUGE *lpChar,unsigned char charValue,unsigned long length)const; DWORD imageExtent(void)const; WORD processBitmap(const String &pathFileName); String mFileName; WORD mMaxColors; Mode mCurrentMode; BITMAPFILEHEADER mBitmapFileHeader; PurePalette mBitmapPalette; const LONG mBlockSize; HFILE mhFile; DWORD mImageExtent; DWORD mWidth; DWORD mHeight; }; inline DWORD Bitmap::imageExtent(void)const { BITMAPINFO *lpBitmapInfo=getInfoPtr(); return (((((lpBitmapInfo->bmiHeader.biWidth*lpBitmapInfo->bmiHeader.biBitCount)+31)&~31)>>3)*lpBitmapInfo->bmiHeader.biHeight); } inline DWORD Bitmap::getImageExtent(void)const { return mImageExtent; } inline WORD Bitmap::isOkay(void)const { return BitmapData::isOkay(); } inline HGLOBAL Bitmap::lockedImageData(void)const { return getDataHnd(); } inline HGLOBAL Bitmap::lockedBitmapInfo(void)const { return getInfoHnd(); } inline WORD Bitmap::operator==(const Bitmap &someBitmap)const { return mFileName==someBitmap.mFileName; } inline WORD Bitmap::width(void)const { return (WORD)mWidth; } inline WORD Bitmap::height(void)const { return (WORD)mHeight; } inline void Bitmap::closeFile(void) { if(HFILE_ERROR!=mhFile){::_lclose(mhFile);mhFile=HFILE_ERROR;} } inline void Bitmap::setBits(BYTE byteValue) { setBits(getDataPtr(),byteValue,(LONG)width()*(LONG)height()); } inline BYTE Bitmap::getByte(WORD row,WORD col)const { UHUGE *lpBitmapData; lpBitmapData=getDataPtr(); if(row>=height()||col>=width())return FALSE; UHUGE *lpImage; lpImage=(lpBitmapData+((LONG)width()*(LONG)height())); return *((lpImage-(((LONG)row*(LONG)width())+(LONG)width()))+(LONG)col); } inline void Bitmap::setByte(WORD row,WORD col,BYTE byteValue) { UHUGE *lpBitmapData; lpBitmapData=getDataPtr(); if(row>=height()||col>=width())return; UHUGE *lpImage; lpImage=(lpBitmapData+((LONG)width()*(LONG)height())); *((lpImage-(((LONG)row*(LONG)width())+(LONG)width()))+(LONG)col)=byteValue; } inline WORD Bitmap::planes(void)const { if(!isOkay())return FALSE; return getInfoPtr()->bmiHeader.biPlanes; } inline WORD Bitmap::bitCount(void)const { if(!isOkay())return FALSE; return getInfoPtr()->bmiHeader.biBitCount; } inline void *Bitmap::ptrData(void) { return getDataPtr(); } #endif