Files
Work/ddraw/DRAW.CPP
2024-08-07 09:16:27 -04:00

158 lines
4.9 KiB
C++

#include <ddraw/draw.hpp>
#include <ddraw/surface.hpp>
#include <ddraw/dspenum.hpp>
#include <ddraw/sfcdesc.hpp>
#include <ddraw/direct3d.hpp>
#include <ddraw/device3d.hpp>
#include <ddraw/devenum.hpp>
#include <ddraw/palette.hpp>
#include <common/guiwnd.hpp>
DirectDraw::DirectDraw(void)
{
createDirectDraw();
}
DirectDraw::DirectDraw(const DirectDraw &directDraw)
{ // private implementation
*this=directDraw;
}
DirectDraw &DirectDraw::operator=(const DirectDraw &/*directDraw*/)
{
return *this;
}
DirectDraw::~DirectDraw()
{
destroy();
}
DirectDrawError DirectDraw::setCooperativeLevel(GUIWindow &parentWindow,CoopFlags coopFlags)
{
if(!isOkay())return DirectDrawError::GenericFailure;
return DirectDrawError::DirectDrawResult(mDirectDraw4->SetCooperativeLevel(parentWindow,coopFlags));
}
DirectDrawError DirectDraw::testCooperativeLevel(void)
{
if(!isOkay())return DirectDrawError::GenericFailure;
return DirectDrawError::DirectDrawResult(mDirectDraw4->TestCooperativeLevel());
}
DirectDrawError DirectDraw::setCooperativeLevel(CoopFlags coopFlags)
{
if(!isOkay())return DirectDrawError::GenericFailure;
return DirectDrawError::DirectDrawResult(mDirectDraw4->SetCooperativeLevel((HWND)0,coopFlags));
}
BOOL DirectDraw::enumerateModes(DisplayEnumerator &displayEnumerator)
{
if(!isOkay())return FALSE;
displayEnumerator.enumeratedModes().remove();
mDirectDraw4->EnumDisplayModes(DDEDM_REFRESHRATES,0,&displayEnumerator,DisplayEnumerator::enumModesCallback);
return TRUE;
}
BOOL DirectDraw::setDisplayMode(int width,int height,int bpp,int refreshRate)
{
if(!isOkay())return FALSE;
return (DD_OK==mDirectDraw4->SetDisplayMode(width,height,bpp,refreshRate,0));
}
BOOL DirectDraw::getDisplayMode(SurfaceDescription &surfaceDescription)
{
if(!isOkay())return FALSE;
return (DD_OK==mDirectDraw4->GetDisplayMode(&surfaceDescription.getDDSURFACEDESC2()));
}
BOOL DirectDraw::restoreDisplayMode(void)
{
if(!isOkay())return FALSE;
return (DD_OK==mDirectDraw4->RestoreDisplayMode());
}
BOOL DirectDraw::restoreAllSurfaces(void)
{
if(!isOkay())return FALSE;
return DD_OK==mDirectDraw4->RestoreAllSurfaces();
}
DirectDrawError DirectDraw::createSurface(const SurfaceDescription &surfaceDescription,Surface &surface)
{
LPDIRECTDRAWSURFACE4 lpDDSurface4;
DirectDrawError errorResult(DirectDrawError::GenericFailure);
surface.destroy();
if(!isOkay())return DirectDrawError::GenericFailure;
errorResult=DirectDrawError::DirectDrawResult(mDirectDraw4->CreateSurface(&((SurfaceDescription&)surfaceDescription).getDDSURFACEDESC2(),&lpDDSurface4,0));
if(!(DirectDrawError::Ok==errorResult.result()))return errorResult;
(SmartPointer<IDirectDrawSurface4>&)surface=lpDDSurface4;
return errorResult;
}
BOOL DirectDraw::createDirectDraw(void)
{
HRESULT hResult;
LPDIRECTDRAW lpDirectDraw;
LPDIRECTDRAW4 lpDirectDraw4;
hResult=::DirectDrawCreate(NULL,&lpDirectDraw,NULL);
if(hResult<0)return FALSE;
mDirectDraw=lpDirectDraw;
hResult=mDirectDraw->QueryInterface(IID_IDirectDraw4,(void**)&lpDirectDraw4);
if(hResult<0){mDirectDraw->Release();mDirectDraw.destroy();return FALSE;}
mDirectDraw4=lpDirectDraw4;
return isOkay();
}
DirectDrawError DirectDraw::createDirect3D(Surface &renderSurface,Direct3D &direct3D,DirectDevice3D &device3D)
{
DirectDrawError status(DirectDrawError::GenericFailure);
LPDIRECT3D3 lpDirect3D3;
LPDIRECT3DDEVICE3 lpDirect3DDevice3;
DeviceEnumerator enumDevice;
if(!isOkay())return status;
direct3D.destroy();
status=DirectDrawError::DirectDrawResult(mDirectDraw->QueryInterface(IID_IDirect3D3,(void**)&lpDirect3D3));
if(!status.okResult())return status;
(SmartPointer<IDirect3D3>&)direct3D=lpDirect3D3;
direct3D.enumerateDevice(enumDevice);
if(!enumDevice.enumeratedDevices().size()){direct3D.destroy();status.result(DirectDrawError::GenericFailure);return status;}
status=direct3D.createDevice(enumDevice.enumeratedDevices()[0],renderSurface,device3D);
if(!status.okResult())return status;
return status;
}
DirectDrawError DirectDraw::createPalette(DirectPalette &directPalette)
{
DirectDrawError status(DirectDrawError::GenericFailure);
LPDIRECTDRAWPALETTE lpDDPalette;
if(!isOkay())return status;
directPalette.destroy();
status=DirectDrawError::DirectDrawResult(mDirectDraw4->CreatePalette(directPalette.flags(),&((PALETTEENTRY&)directPalette[0]),&lpDDPalette,0));
if(!status.okResult())return status;
(SmartPointer<IDirectDrawPalette>&)directPalette=lpDDPalette;
return status;
}
DirectDrawError DirectDraw::flipToGDISurface(void)
{
if(!isOkay())return DirectDrawError::GenericFailure;
return DirectDrawError::DirectDrawResult(mDirectDraw4->FlipToGDISurface());
}
void DirectDraw::destroy(void)
{
if(!isOkay())return;
if(mDirectDraw4.isOkay()){mDirectDraw4->Release();mDirectDraw4.destroy();}
if(mDirectDraw.isOkay()){mDirectDraw->Release();mDirectDraw.destroy();}
}
BOOL DirectDraw::isOkay(void)const
{
return mDirectDraw.isOkay()&&mDirectDraw4.isOkay();
}