#ifndef _COMMON_DIBITMAP_HPP_ #define _COMMON_DIBITMAP_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_BITMAPINFO_HPP_ #include #endif #ifndef _COMMON_PUREPALETTE_HPP_ #include #endif #ifndef _COMMON_EXCEPTION_HPP_ #include #endif #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif class BitmapOverlay; class Bitmap; class ResBitmap; class Vector2D; class Point; class DIBitmap : public BitmapInfo { public: DIBitmap(const PureDevice &pureDevice,DWORD bmWidth,DWORD bmHeight,const PurePalette &purePalette); DIBitmap(const PureDevice &pureDevice,const BitmapInfo &someBitmapInfo,const PurePalette &purePalette); DIBitmap(const BitmapInfo &someBitmapInfo); DIBitmap(const DIBitmap &someDIBitmap); virtual ~DIBitmap(); DIBitmap &operator=(const DIBitmap &someDIBitmap); DIBitmap &operator+=(BitmapOverlay &someBitmapOverlay); bool overlay(Bitmap &bitmap,const Point &placementPoint); bool overlay(ResBitmap &resBitmap,const Point &placementPoint); bool overlay(DIBitmap &bitmap,const Point &placementPoint); bool getAt(SmartPointer &bitmap,const Rect &areaRect); void setByte(WORD row,WORD col,BYTE byteValue); BYTE getByte(WORD row,WORD col)const; void line(const Point &firstPoint,const Point &secondPoint,BYTE byteValue); void outlineRect(const Rect &outlineRect,BYTE byteValue=0); void colorRect(const Rect &rect,BYTE byteValue=0); WORD square(const Point ¢erPoint,WORD lineLength,const RGBColor &lineColor); WORD square(const Point ¢erPoint,WORD lineLength,BYTE indexColor); WORD circle(WORD aspectValue,const Point &xyPoint,WORD radius,WORD palIndex); WORD bitBlt(PureDevice &displayDevice,PureDevice::BltMode ropCode=PureDevice::SourceCopy); WORD bitBlt(PureDevice &displayDevice,const Rect &dstRect,const Point &srcPoint,PureDevice::BltMode ropCode=PureDevice::SourceCopy); WORD bitBlt(PureDevice &displayDevice,const Point &srcPoint,PureDevice::BltMode ropCode=PureDevice::SourceCopy); BOOL stretchBlt(PureDevice &displayDevice,const Rect &dstRect,PureDevice::BltMode ropCode=PureDevice::SourceCopy); void setBits(BYTE charByte); bool copyBits(unsigned char *ptrData,DWORD length); void clearBits(void); WORD size(DWORD newWidth,DWORD newHeight); void *ptrData(void); DWORD imageExtent(void)const; BOOL usePalette(BOOL usage); BOOL usePalette(PureDevice &pureDevice,BOOL usage); WORD isOkay(void)const; PurePalette &getPalette(void); PureDevice &getDevice(void); HBITMAP getBitmap(void); private: bool overlay(const Point &placementPoint,int srcWidth,int srcHeight,UCHAR *pBmBits); void copyBits(unsigned char *lpDstPtr,unsigned char *lpSrcPtr,DWORD length)const; void createBitmap(const PureDevice &somePureDevice); void createBitmap(void); void destroyBitmap(void); void verifyDimensions(DWORD &desiredWidth,DWORD desiredHeight)const; HBITMAP mhBitmap; void *mlpBmBits; DWORD mImageExtent; PureDevice mBitmapDevice; PurePalette mBitmapPalette; }; inline DIBitmap::DIBitmap(const DIBitmap &someDIBitmap) : mhBitmap(0), mImageExtent(0), mlpBmBits(0) { *this=someDIBitmap; } inline DIBitmap::DIBitmap(const PureDevice &somePureDevice,DWORD bmWidth,DWORD bmHeight,const PurePalette &purePalette) : mhBitmap(0), mImageExtent(0), mlpBmBits(0) { verifyDimensions(bmWidth,bmHeight); width(bmWidth); height(bmHeight); static_cast(*this)=purePalette; mBitmapPalette=purePalette; createBitmap(somePureDevice); if(!isOkay())return; mBitmapDevice.compatibleDevice(somePureDevice); mBitmapDevice.select(mhBitmap); } inline DIBitmap::DIBitmap(const PureDevice &somePureDevice,const BitmapInfo &someBitmapInfo,const PurePalette &purePalette) : mhBitmap(0), mImageExtent(0), mlpBmBits(0), BitmapInfo(someBitmapInfo) { DWORD bmWidth(width()); DWORD bmHeight(height()); verifyDimensions(bmWidth,bmHeight); width(bmWidth); height(bmHeight); static_cast(*this)=purePalette; mBitmapPalette=purePalette; createBitmap(somePureDevice); if(!isOkay())return; mBitmapDevice.compatibleDevice(somePureDevice); mBitmapDevice.select(mhBitmap); } inline DIBitmap::DIBitmap(const BitmapInfo &someBitmapInfo) : mhBitmap(0), mImageExtent(0), mlpBmBits(0), BitmapInfo(someBitmapInfo) { DWORD bmWidth(width()); DWORD bmHeight(height()); verifyDimensions(bmWidth,bmHeight); width(bmWidth); height(bmHeight); createBitmap(); if(!isOkay())return; } inline DIBitmap::~DIBitmap() { if(isOkay())mBitmapDevice.select(mhBitmap,FALSE); destroyBitmap(); } inline DIBitmap &DIBitmap::operator=(const DIBitmap &someDIBitmap) { destroyBitmap(); (BitmapInfo&)*this=(BitmapInfo&)someDIBitmap; mBitmapPalette=((DIBitmap&)someDIBitmap).getPalette(); createBitmap(someDIBitmap.mBitmapDevice); if(!isOkay())return *this; copyBits((unsigned char*)ptrData(),(unsigned char*)((DIBitmap&)someDIBitmap).ptrData(),imageExtent()); mBitmapDevice.compatibleDevice(someDIBitmap.mBitmapDevice); mBitmapDevice.select(mhBitmap); return *this; } inline void DIBitmap::destroyBitmap(void) { if(!mhBitmap)return; mBitmapDevice.select(mhBitmap,FALSE); ::DeleteObject(mhBitmap); mhBitmap=0; mlpBmBits=0; mImageExtent=0; } inline void DIBitmap::setByte(WORD row,WORD col,BYTE byteValue) { if(!isOkay()||row>=height()||col>=width())return; BYTE *lpImage=(BYTE*)mlpBmBits+width()*height(); *((lpImage-((LONG)row*width()+width()))+(LONG)col)=byteValue; } inline BYTE DIBitmap::getByte(WORD row,WORD col)const { if(!isOkay()||row>=height()||col>=width())return (BYTE)FALSE; BYTE *lpImage=(BYTE*)mlpBmBits+width()*height(); return *((lpImage-((LONG)row*width()+width()))+(LONG)col); } inline WORD DIBitmap::bitBlt(PureDevice &displayDevice,PureDevice::BltMode ropCode) { if(!isOkay())return FALSE; return ::BitBlt(displayDevice,0,0,width(),height(),mBitmapDevice,0,0,ropCode); } inline WORD DIBitmap::bitBlt(PureDevice &displayDevice,const Point &srcPoint,PureDevice::BltMode ropCode) { if(!isOkay())return FALSE; return ::BitBlt(displayDevice,0,0,width(),height(),mBitmapDevice,srcPoint.x(),srcPoint.y(),ropCode); } inline WORD DIBitmap::bitBlt(PureDevice &displayDevice,const Rect &dstRect,const Point &srcPoint,PureDevice::BltMode ropCode) { if(!isOkay())return FALSE; return ::BitBlt(displayDevice,dstRect.left(),dstRect.top(),dstRect.right(),dstRect.bottom(),mBitmapDevice,srcPoint.x(),srcPoint.y(),ropCode); } inline BOOL DIBitmap::stretchBlt(PureDevice &displayDevice,const Rect &dstRect,PureDevice::BltMode ropCode) { if(!isOkay())return FALSE; return ::StretchBlt(displayDevice,dstRect.left(),dstRect.top(),dstRect.right(),dstRect.bottom(),mBitmapDevice,0,0,width(),height(),ropCode); } inline void *DIBitmap::ptrData(void) { if(!mlpBmBits)throw(NullError()); return mlpBmBits; } inline DWORD DIBitmap::imageExtent(void)const { return mImageExtent; } inline WORD DIBitmap::square(const Point ¢erPoint,WORD lineLength,const RGBColor &lineColor) { return square(centerPoint,lineLength,mBitmapPalette.paletteIndex(lineColor)); } inline WORD DIBitmap::isOkay(void)const { return (mhBitmap?TRUE:FALSE); } inline PurePalette &DIBitmap::getPalette(void) { return mBitmapPalette; } inline PureDevice &DIBitmap::getDevice(void) { return mBitmapDevice; } inline HBITMAP DIBitmap::getBitmap(void) { return mhBitmap; } inline BOOL DIBitmap::usePalette(BOOL usage) { if(!isOkay()||!mBitmapDevice.isOkay())return FALSE; mBitmapPalette.usePalette(mBitmapDevice,usage); return TRUE; } inline BOOL DIBitmap::usePalette(PureDevice &pureDevice,BOOL usage) { if(!isOkay())return FALSE; mBitmapPalette.usePalette(pureDevice,usage); return TRUE; } #endif