Files
Work/ddraw/SURFACE.HPP
2024-08-07 09:16:27 -04:00

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