1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00
2023-11-11 17:16:39 +01:00

76 lines
2.0 KiB
C++

#pragma once
#include <functional>
#include <memory>
#include <vector>
#include <ddraw.h>
#include <Common/CompatPtr.h>
#include <Common/CompatRef.h>
namespace DDraw
{
template <typename TSurface> class SurfaceImpl;
template <typename TSurface> class SurfaceImpl2;
class Surface
{
public:
static const DWORD ALIGNMENT = 32;
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID*);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
Surface(DWORD origFlags, DWORD origCaps);
virtual ~Surface();
static void* alignBuffer(void* buffer);
template <typename TDirectDraw, typename TSurface, typename TSurfaceDesc>
static HRESULT create(
CompatRef<TDirectDraw> dd, TSurfaceDesc desc, TSurface*& surface, std::unique_ptr<Surface> privateData);
static void enumSurfaces(const std::function<void(Surface&)>& callback);
template <typename TSurface>
static Surface* getSurface(TSurface& dds);
CompatWeakPtr<IDirectDrawSurface7> getDDS() const { return m_surface; };
DWORD getOrigCaps() const { return m_origCaps; }
template <typename TSurface>
SurfaceImpl<TSurface>* getImpl() const;
virtual void restore();
void setSizeOverride(DWORD width, DWORD height);
protected:
static void attach(CompatRef<IDirectDrawSurface7> dds, std::unique_ptr<Surface> privateData);
virtual void createImpl();
void fixAlignment(CompatRef<IDirectDrawSurface7> surface);
std::unique_ptr<SurfaceImpl<IDirectDrawSurface>> m_impl;
std::unique_ptr<SurfaceImpl<IDirectDrawSurface2>> m_impl2;
std::unique_ptr<SurfaceImpl<IDirectDrawSurface3>> m_impl3;
std::unique_ptr<SurfaceImpl<IDirectDrawSurface4>> m_impl4;
std::unique_ptr<SurfaceImpl<IDirectDrawSurface7>> m_impl7;
CompatWeakPtr<IDirectDrawSurface7> m_surface;
private:
template <typename TDirectDrawSurface>
friend class SurfaceImpl;
DWORD m_origFlags;
DWORD m_origCaps;
DWORD m_refCount;
SIZE m_sizeOverride;
std::unique_ptr<void, void(*)(void*)> m_sysMemBuffer;
};
}