223 lines
8.1 KiB
C++
223 lines
8.1 KiB
C++
#ifndef _DDRAW_SURFACE_HPP_
|
|
#define _DDRAW_SURFACE_HPP_
|
|
#ifndef _COMMON_SMARTPOINTER_HPP_
|
|
#include <common/pointer.hpp>
|
|
#endif
|
|
#ifndef _COMMON_GDIPOINT_HPP_
|
|
#include <common/gdipoint.hpp>
|
|
#endif
|
|
#ifndef _COMMON_RECTANGLE_HPP_
|
|
#include <common/rect.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_DDRAW_HPP_
|
|
#include <ddraw/ddraw.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_PIXELFORMAT_HPP_
|
|
#include <ddraw/pixform.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_BLITEFFECTS_HPP_
|
|
#include <ddraw/bltfx.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_SURFACEDESCRIPTION_HPP_
|
|
#include <ddraw/sfcdesc.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_DIRECTPALETTE_HPP_
|
|
#include <ddraw/palette.hpp>
|
|
#endif
|
|
#ifndef _DDRAW_DIRECTDRAWERROR_HPP_
|
|
#include <ddraw/error.hpp>
|
|
#endif
|
|
|
|
class Surface : private SmartPointer<IDirectDrawSurface4>
|
|
{
|
|
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<IDirectDrawSurface4>&)*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<IDirectDrawSurface4>&)*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<IDirectDrawSurface4>&)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<IDirectDrawSurface4>&)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<IDirectDrawSurface4>&)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<IDirectDrawSurface4>&)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<IDirectDrawSurface4>&)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<IDirectDrawSurface4>::destroy();
|
|
}
|
|
|
|
inline
|
|
BOOL Surface::isOkay(void)const
|
|
{
|
|
return SmartPointer<IDirectDrawSurface4>::isOkay();
|
|
}
|
|
#endif
|