#ifndef _DDRAW_SURFACE_HPP_ #define _DDRAW_SURFACE_HPP_ #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif #ifndef _COMMON_GDIPOINT_HPP_ #include #endif #ifndef _COMMON_RECTANGLE_HPP_ #include #endif #ifndef _DDRAW_DDRAW_HPP_ #include #endif #ifndef _DDRAW_PIXELFORMAT_HPP_ #include #endif #ifndef _DDRAW_BLITEFFECTS_HPP_ #include #endif #ifndef _DDRAW_SURFACEDESCRIPTION_HPP_ #include #endif #ifndef _DDRAW_DIRECTPALETTE_HPP_ #include #endif #ifndef _DDRAW_DIRECTDRAWERROR_HPP_ #include #endif class Surface : private SmartPointer { public: enum Disposition{Release,Assume}; enum BltFastFlags{BltFastDstColorKey=DDBLTFAST_DESTCOLORKEY,BltFastNoColorKey=DDBLTFAST_NOCOLORKEY, BltFastSrcColorKey=DDBLTFAST_SRCCOLORKEY,BltFastWait=DDBLTFAST_WAIT}; enum BltFlags{BltColorFill=DDBLT_COLORFILL,BltEffects=DDBLT_DDFX,BltRaster=DDBLT_DDROPS, BltDepthFill=DDBLT_DEPTHFILL,BltKeyDstOverride=DDBLT_KEYDESTOVERRIDE, BltKeySrcOverride=DDBLT_KEYSRCOVERRIDE,BltUseWin32Raster=DDBLT_ROP,BltRotationAngle=DDBLT_ROTATIONANGLE, BltKeyDst=DDBLT_KEYDEST,BltKeySrc=DDBLT_KEYSRC,BltAsync=DDBLT_ASYNC,BltWait=DDBLT_WAIT}; enum LockFlags{LockNoSysLock=DDLOCK_NOSYSLOCK,LockReadOnly=DDLOCK_READONLY, LockSurfaceMemPtr=DDLOCK_SURFACEMEMORYPTR,LockWait=DDLOCK_WAIT,LockWriteOnly=DDLOCK_WRITEONLY}; friend class DirectDraw; Surface(void); virtual ~Surface(); DirectDrawError getPixelFormat(PixelFormat &pixelFormat); DirectDrawError bltFast(const GDIPoint &xyDstPoint,Surface &srcSurface,const Rect &srcRect,BltFastFlags bltFlags=BltFastWait); DirectDrawError bltFast(const GDIPoint &xyDstPoint,Surface &srcSurface,BltFastFlags bltFlags=BltFastWait); DirectDrawError bltFast(Surface &srcSurface,BltFastFlags bltFlags=BltFastWait); DirectDrawError blt(const Rect &dstRect,Surface &srcSurface,const Rect &srcRect,BltFlags bltFlags=BltWait); DirectDrawError blt(const Rect &dstRect,Surface &srcSurface,const Rect &srcRect,::BltEffects &bltEffects,BltFlags bltFlags=BltWait); DirectDrawError blt(Surface &srcSurface,::BltEffects &bltEffects,BltFlags bltFlags=BltWait); DirectDrawError blt(::BltEffects &bltEffects,BltFlags bltFlags=BltWait); DirectDrawError setPalette(DirectPalette &directPalette); DirectDrawError getDC(HDC &hDC); DirectDrawError releaseDC(HDC hDC); DirectDrawError lock(SurfaceDescription &surfaceDescription,LockFlags lockFlags=LockFlags((int)LockNoSysLock|(int)LockWriteOnly|(int)LockSurfaceMemPtr|(int)LockWait)); DirectDrawError unlock(void); DirectDrawError getAttachedSurface(const SurfaceCapabilities &surfaceCapabilities,Surface &surface); DirectDrawError flip(void); void destroy(void); BOOL isOkay(void)const; private: Surface(const Surface &someSurface); Surface &operator=(const Surface &someSurface); Disposition mDisposition; }; inline Surface::Surface(void) : mDisposition(Release) { } inline Surface::Surface(const Surface &someSurface) { // private implementation *this=someSurface; } inline Surface::~Surface() { destroy(); } inline Surface &Surface::operator=(const Surface &/*someSurface*/) { // private implementation return *this; } inline DirectDrawError Surface::getPixelFormat(PixelFormat &pixelFormat) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->GetPixelFormat(&pixelFormat.getDDPIXELFORMAT())); } inline DirectDrawError Surface::bltFast(const GDIPoint &xyDstPoint,Surface &srcSurface,const Rect &srcRect,BltFastFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->BltFast(xyDstPoint.x(),xyDstPoint.y(),(IDirectDrawSurface4*)((SmartPointer&)*this),(RECT*)(Rect&)srcRect,(DWORD)bltFlags)); } inline DirectDrawError Surface::bltFast(const GDIPoint &xyDstPoint,Surface &srcSurface,BltFastFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->BltFast(xyDstPoint.x(),xyDstPoint.y(),(IDirectDrawSurface4*)((SmartPointer&)*srcSurface),0,(DWORD)bltFlags)); } inline DirectDrawError Surface::bltFast(Surface &srcSurface,BltFastFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->BltFast(0,0,(IDirectDrawSurface4*)((SmartPointer&)srcSurface),0,(DWORD)bltFlags)); } inline DirectDrawError Surface::blt(const Rect &dstRect,Surface &srcSurface,const Rect &srcRect,BltFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Blt((RECT*)(Rect&)dstRect,(IDirectDrawSurface4*)((SmartPointer&)srcSurface),(RECT*)(Rect&)srcRect,(DWORD)bltFlags,0)); } inline DirectDrawError Surface::blt(const Rect &dstRect,Surface &srcSurface,const Rect &srcRect,::BltEffects &bltEffects,BltFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Blt((RECT*)(Rect&)dstRect,(IDirectDrawSurface4*)((SmartPointer&)srcSurface),(RECT*)(Rect&)srcRect,(DWORD)bltFlags|(DWORD)BltEffects,&bltEffects.getDDBLTFX())); } inline DirectDrawError Surface::blt(Surface &srcSurface,::BltEffects &bltEffects,BltFlags bltFlags) { if(!isOkay()||!srcSurface.isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Blt(0,(IDirectDrawSurface4*)((SmartPointer&)srcSurface),0,(DWORD)bltFlags,&bltEffects.getDDBLTFX())); } inline DirectDrawError Surface::blt(::BltEffects &bltEffects,BltFlags bltFlags) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Blt(0,0,0,(DWORD)bltFlags|BltEffects,&bltEffects.getDDBLTFX())); } inline DirectDrawError Surface::setPalette(DirectPalette &directPalette) { DirectDrawError status(DirectDrawError::GenericFailure); if(!isOkay()||!directPalette.isOkay())return status; status=DirectDrawError::DirectDrawResult(operator->()->SetPalette((IDirectDrawPalette*)directPalette)); return status; } inline DirectDrawError Surface::getDC(HDC &hDC) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->GetDC(&hDC)); } inline DirectDrawError Surface::releaseDC(HDC hDC) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->ReleaseDC(hDC)); } inline DirectDrawError Surface::lock(SurfaceDescription &surfaceDescription,LockFlags lockFlags) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Lock(0,&surfaceDescription.getDDSURFACEDESC2(),lockFlags,0)); } inline DirectDrawError Surface::unlock(void) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Unlock(0)); } inline DirectDrawError Surface::getAttachedSurface(const SurfaceCapabilities &surfaceCapabilities,Surface &surface) { DirectDrawError status(DirectDrawError::GenericFailure); LPDIRECTDRAWSURFACE4 lpDirectDrawSurface; if(!isOkay())return status; surface.destroy(); status=DirectDrawError::DirectDrawResult(operator->()->GetAttachedSurface(&((SurfaceCapabilities&)surfaceCapabilities).getDDSCAPS2(),&lpDirectDrawSurface)); if(!status.okResult())return status; (SmartPointer&)surface=lpDirectDrawSurface; surface.mDisposition=Surface::Assume; return status; } inline DirectDrawError Surface::flip(void) { if(!isOkay())return DirectDrawError::GenericFailure; return DirectDrawError::DirectDrawResult(operator->()->Flip(0,DDFLIP_WAIT)); } inline void Surface::destroy(void) { if(!isOkay())return; if(Release==mDisposition)operator->()->Release(); SmartPointer::destroy(); } inline BOOL Surface::isOkay(void)const { return SmartPointer::isOkay(); } #endif