mirror of
https://github.com/LostArtefacts/TRX.git
synced 2025-05-13 05:57:10 +03:00
141 lines
5.2 KiB
C++
141 lines
5.2 KiB
C++
#pragma once
|
|
|
|
#include "DirectDraw.hpp"
|
|
#include "DirectDrawClipper.hpp"
|
|
#include "Renderer.hpp"
|
|
#include "Unknown.hpp"
|
|
#include "ddraw.hpp"
|
|
|
|
#include <glrage/GLRage.hpp>
|
|
|
|
#include <cstdint>
|
|
#include <vector>
|
|
|
|
namespace glrage {
|
|
namespace ddraw {
|
|
|
|
class DirectDrawSurface
|
|
: public Unknown
|
|
, public IDirectDrawSurface
|
|
, public IDirectDrawSurface2
|
|
{
|
|
public:
|
|
DirectDrawSurface(DirectDraw& lpDD,
|
|
Renderer& renderer,
|
|
LPDDSURFACEDESC lpDDSurfaceDesc);
|
|
virtual ~DirectDrawSurface();
|
|
|
|
/*** IUnknown methods ***/
|
|
virtual HRESULT WINAPI QueryInterface(REFIID riid, LPVOID* ppvObj);
|
|
virtual ULONG WINAPI AddRef();
|
|
virtual ULONG WINAPI Release();
|
|
|
|
/*** IDirectDrawSurface methods ***/
|
|
HRESULT WINAPI AddAttachedSurface(LPDIRECTDRAWSURFACE lpDDSAttachedSurface);
|
|
HRESULT WINAPI AddOverlayDirtyRect(LPRECT lpRect);
|
|
HRESULT WINAPI Blt(LPRECT lpDestRect,
|
|
LPDIRECTDRAWSURFACE lpDDSrcSurface,
|
|
LPRECT lpSrcRect,
|
|
DWORD dwFlags,
|
|
LPDDBLTFX lpDDBltFx);
|
|
HRESULT WINAPI BltBatch(LPDDBLTBATCH lpDDBltBatch,
|
|
DWORD dwCount,
|
|
DWORD dwFlags);
|
|
HRESULT WINAPI BltFast(DWORD dwX,
|
|
DWORD dwY,
|
|
LPDIRECTDRAWSURFACE lpDDSrcSurface,
|
|
LPRECT lpSrcRect,
|
|
DWORD dwTrans);
|
|
HRESULT WINAPI DeleteAttachedSurface(DWORD dwFlags,
|
|
LPDIRECTDRAWSURFACE lpDDSurface);
|
|
HRESULT WINAPI EnumAttachedSurfaces(LPVOID lpContext,
|
|
LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback);
|
|
HRESULT WINAPI EnumOverlayZOrders(DWORD dwFlags,
|
|
LPVOID lpContext,
|
|
LPDDENUMSURFACESCALLBACK lpfnCallback);
|
|
HRESULT WINAPI Flip(LPDIRECTDRAWSURFACE lpDDSurfaceTargetOverride,
|
|
DWORD dwFlags);
|
|
HRESULT WINAPI GetAttachedSurface(LPDDSCAPS lpDDSCaps,
|
|
LPDIRECTDRAWSURFACE* lplpDDAttachedSurface);
|
|
HRESULT WINAPI GetBltStatus(DWORD dwFlags);
|
|
HRESULT WINAPI GetCaps(LPDDSCAPS lpDDSCaps);
|
|
HRESULT WINAPI GetClipper(LPDIRECTDRAWCLIPPER* lplpDDClipper);
|
|
HRESULT WINAPI GetColorKey(DWORD dwFlags, LPDDCOLORKEY lpDDColorKey);
|
|
HRESULT WINAPI GetDC(HDC* phDC);
|
|
HRESULT WINAPI GetFlipStatus(DWORD dwFlags);
|
|
HRESULT WINAPI GetOverlayPosition(LPLONG lplX, LPLONG lplY);
|
|
HRESULT WINAPI GetPalette(LPDIRECTDRAWPALETTE* lplpDDPalette);
|
|
HRESULT WINAPI GetPixelFormat(LPDDPIXELFORMAT lpDDPixelFormat);
|
|
HRESULT WINAPI GetSurfaceDesc(LPDDSURFACEDESC lpDDSurfaceDesc);
|
|
HRESULT WINAPI Initialize(LPDIRECTDRAW lpDD,
|
|
LPDDSURFACEDESC lpDDSurfaceDesc);
|
|
HRESULT WINAPI IsLost();
|
|
HRESULT WINAPI Lock(LPRECT lpDestRect,
|
|
LPDDSURFACEDESC lpDDSurfaceDesc,
|
|
DWORD dwFlags,
|
|
HANDLE hEvent);
|
|
HRESULT WINAPI ReleaseDC(HDC hDC);
|
|
HRESULT WINAPI Restore();
|
|
HRESULT WINAPI SetClipper(LPDIRECTDRAWCLIPPER lpDDClipper);
|
|
HRESULT WINAPI SetColorKey(DWORD dwFlags, LPDDCOLORKEY lpDDColorKey);
|
|
HRESULT WINAPI SetOverlayPosition(LONG lX, LONG lY);
|
|
HRESULT WINAPI SetPalette(LPDIRECTDRAWPALETTE lpDDPalette);
|
|
HRESULT WINAPI Unlock(LPVOID lp);
|
|
HRESULT WINAPI UpdateOverlay(LPRECT lpSrcRect,
|
|
LPDIRECTDRAWSURFACE lpDDDestSurface,
|
|
LPRECT lpDestRect,
|
|
DWORD dwFlags,
|
|
LPDDOVERLAYFX lpDDOverlayFx);
|
|
HRESULT WINAPI UpdateOverlayDisplay(DWORD dwFlags);
|
|
HRESULT WINAPI UpdateOverlayZOrder(DWORD dwFlags,
|
|
LPDIRECTDRAWSURFACE lpDDSReference);
|
|
|
|
/*** IDirectDrawSurface2 methods ***/
|
|
HRESULT WINAPI AddAttachedSurface(
|
|
LPDIRECTDRAWSURFACE2 lpDDSAttachedSurface); // updated in v2
|
|
HRESULT WINAPI Blt(LPRECT lpDestRect,
|
|
LPDIRECTDRAWSURFACE2 lpDDSrcSurface,
|
|
LPRECT lpSrcRect,
|
|
DWORD dwFlags,
|
|
LPDDBLTFX lpDDBltFx); // updated in v2
|
|
HRESULT WINAPI BltFast(DWORD dwX,
|
|
DWORD dwY,
|
|
LPDIRECTDRAWSURFACE2 lpDDSrcSurface,
|
|
LPRECT lpSrcRect,
|
|
DWORD dwTrans); // updated in v2
|
|
HRESULT WINAPI DeleteAttachedSurface(DWORD dwFlags,
|
|
LPDIRECTDRAWSURFACE2 lpDDSurface); // updated in v2
|
|
HRESULT WINAPI Flip(LPDIRECTDRAWSURFACE2 lpDDSurfaceTargetOverride,
|
|
DWORD dwFlags); // updated in v2
|
|
HRESULT WINAPI GetAttachedSurface(LPDDSCAPS lpDDSCaps,
|
|
LPDIRECTDRAWSURFACE2* lplpDDAttachedSurface); // updated in v2
|
|
HRESULT WINAPI UpdateOverlay(LPRECT lpSrcRect,
|
|
LPDIRECTDRAWSURFACE2 lpDDDestSurface,
|
|
LPRECT lpDestRect,
|
|
DWORD dwFlags,
|
|
LPDDOVERLAYFX lpDDOverlayFx); // updated in v2
|
|
HRESULT WINAPI UpdateOverlayZOrder(DWORD dwFlags,
|
|
LPDIRECTDRAWSURFACE2 lpDDSReference); // updated in v2
|
|
HRESULT WINAPI GetDDInterface(LPVOID* lplpDD); // added in v2
|
|
HRESULT WINAPI PageLock(DWORD dwFlags); // added in v2
|
|
HRESULT WINAPI PageUnlock(DWORD dwFlags); // added in v2
|
|
|
|
private:
|
|
Context& m_context = GLRage::getContext();
|
|
DirectDraw& m_dd;
|
|
Renderer& m_renderer;
|
|
std::vector<uint8_t> m_buffer;
|
|
DDSURFACEDESC m_desc;
|
|
DirectDrawSurface* m_backBuffer = nullptr;
|
|
DirectDrawSurface* m_depthBuffer = nullptr;
|
|
DirectDrawClipper* m_clipper = nullptr;
|
|
bool m_locked = false;
|
|
bool m_dirty = false;
|
|
|
|
/*** Custom methods ***/
|
|
void clear(int32_t color);
|
|
void rgba5551AdjustBrightness(bool brighten);
|
|
};
|
|
|
|
} // namespace ddraw
|
|
} // namespace glrage
|