Files
Work/common/BITMAP.HPP
2024-08-07 09:09:36 -04:00

206 lines
5.0 KiB
C++

#ifndef _COMMON_BITMAP_HPP_
#define _COMMON_BITMAP_HPP_
#include <stdio.h>
#ifndef _COMMON_WINDOWS_HPP_
#include <common/windows.hpp>
#endif
#ifndef _COMMON_TYPES_HPP_
#include <common/types.hpp>
#endif
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_BITMAPDATA_HPP_
#include <common/bmdata.hpp>
#endif
#ifndef _COMMON_PUREPALETTE_HPP_
#include <common/purepal.hpp>
#endif
#ifndef _COMMON_GLOBALDATA_HPP_
#include <common/gdata.hpp>
#endif
#ifndef _COMMON_BITMAPINFO_HPP_
#include <common/bminfo.hpp>
#endif
#ifndef _COMMON_BITMAPOVERLAY_HPP_
#include <common/boverlay.hpp>
#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<BYTE> &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