#ifndef _JPGIMG_DIB24_HPP_ #define _JPGIMG_DIB24_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_POINT_HPP_ #include #endif #ifndef _COMMON_PUREDEVICE_HPP_ #include #endif #ifndef _JPGIMG_JPGIMAGE_HPP_ #include #endif #ifndef _JPGIMG_RGB888_HPP_ #include #endif class ResBitmap; class DIB24 { public: DIB24(void); DIB24(const DIB24 &image); virtual ~DIB24(); DIB24 &operator=(const DIB24 &image); bool create(int width,int height,PureDevice &pureDevice); bool bitBlt(PureDevice &pureDevice,const Rect &dstRect,const Point &srcPoint); bool draw(PureDevice &pureDevice,const Rect &dstRect,const Point &srcPoint); bool setBits(BYTE value); bool copyBits(ResBitmap &resBitmap); bool getAt(DWORD row,DWORD col,RGB888 &someRGB888)const; bool setAt(DWORD row,DWORD col,const RGB888 &someRGB888); bool setAt(DWORD row,DWORD col,JPGImage &jpgImage); bool setAtAsm(DWORD row,DWORD col,JPGImage &jpgImage); bool line(Point firstPoint,Point secondPoint,const RGB888 &rgb888); RGB888 *rgbArray(void); DWORD extent(void)const; DWORD width(void)const; DWORD height(void)const; HBITMAP getBitmap(void); bool isOkay(void)const; private: void verifyDimensions(BitmapInfo &someBitmapInfo); void destroy(void); HBITMAP mhBitmap; RGB888 *mpRGBArray; BitmapInfo mBitmapInfo; DWORD mExtent; }; inline DIB24::DIB24(void) : mhBitmap(0), mpRGBArray(0), mExtent(0) { } inline DIB24::DIB24(const DIB24 &someDIB24) { *this=someDIB24; } inline DIB24::~DIB24() { destroy(); } inline RGB888 *DIB24::rgbArray(void) { return mpRGBArray; } inline DWORD DIB24::extent(void)const { return mExtent; } inline DWORD DIB24::width(void)const { if(!isOkay())return 0; return mBitmapInfo.width(); } inline DWORD DIB24::height(void)const { if(!isOkay())return 0; return mBitmapInfo.height()<0?-mBitmapInfo.height():mBitmapInfo.height(); } inline void DIB24::destroy(void) { if(!mhBitmap)return; ::DeleteObject(mhBitmap); mhBitmap=0; mExtent=0; } inline HBITMAP DIB24::getBitmap(void) { return mhBitmap; } inline bool DIB24::setBits(BYTE value) { if(!isOkay())return FALSE; ::memset(mpRGBArray,value,extent()*sizeof(RGB888)); return true; } inline bool DIB24::getAt(DWORD row,DWORD col,RGB888 &someRGB888)const { if(!isOkay())return false; if(mBitmapInfo.height()>0)someRGB888=mpRGBArray[row*width()+col]; else someRGB888=mpRGBArray[(mBitmapInfo.width()*(-mBitmapInfo.height()))-(((row*mBitmapInfo.width())+mBitmapInfo.width()))+col]; return true; } inline bool DIB24::setAt(DWORD row,DWORD col,const RGB888 &someRGB888) { if(!isOkay())return false; if(mBitmapInfo.height()>0)mpRGBArray[row*width()+col]=someRGB888; else mpRGBArray[(mBitmapInfo.width()*(-mBitmapInfo.height()))-(((row*mBitmapInfo.width())+mBitmapInfo.width()))+col]=someRGB888; return true; } inline bool DIB24::isOkay(void)const { return mhBitmap?true:false; } #endif