#pragma once #include #include #include "Common/CompatPtr.h" #include "Common/CompatRef.h" namespace DDraw { template class SurfaceImpl; template class SurfaceImpl2; class Surface { public: virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID, LPVOID*); virtual ULONG STDMETHODCALLTYPE AddRef(); virtual ULONG STDMETHODCALLTYPE Release(); virtual ~Surface(); template static HRESULT create(CompatRef dd, TSurfaceDesc desc, TSurface*& surface); template static Surface* getSurface(TSurface& dds); template SurfaceImpl* getImpl() const; protected: Surface(); static void attach(CompatRef dds, std::unique_ptr& privateData); void* m_ddObject; std::unique_ptr> m_impl; std::unique_ptr> m_impl2; std::unique_ptr> m_impl3; std::unique_ptr> m_impl4; std::unique_ptr> m_impl7; private: template friend class SurfaceImpl2; static HRESULT WINAPI attachToLinkedSurfaces( IDirectDrawSurface7* surface, DDSURFACEDESC2* desc, void* rootSurface); virtual void createImpl(); IID m_ddId; DWORD m_refCount; }; }