#include "common.hpp" #include "id3dsurf.h" class CDirect3DSurface8: public IDirect3DSurface8Clone { public: CDirect3DSurface8(); ~CDirect3DSurface8(); /* ULONG AddRef(); HRESULT QueryInterface(REFIID iid, void **ppvObject); ULONG Release();*/ // IUnknown methods STDMETHOD(QueryInterface) (REFIID riid, VOID **ppvObj); STDMETHOD_(ULONG,AddRef) (); STDMETHOD_(ULONG,Release) (); // IBuffer methods STDMETHOD(SetPrivateData)(REFGUID riid, CONST VOID *pvData, DWORD cbData, DWORD dwFlags); STDMETHOD(GetPrivateData)(REFGUID riid, VOID *pvData, DWORD *pcbData); STDMETHOD(FreePrivateData)(REFGUID riid); STDMETHOD(GetContainer)(REFIID riid, void **ppContainer); STDMETHOD(GetDevice)(IDirect3DDevice8 **ppDevice); // IDirect3DSurface8 methods STDMETHOD_(D3DSURFACE_DESC, GetDesc)(); STDMETHOD(LockRect)(D3DLOCKED_RECT *pLockedRectData, CONST RECT *pRect, DWORD dwFlags); STDMETHOD(UnlockRect)(); BOOL Create(int iWidth, int iHeight); /* HRESULT GetDevice(IDirect3DDevice8** ppDevice); HRESULT SetPrivateData(REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags); HRESULT GetPrivateData(REFGUID refguid, void* pData, DWORD* pSizeOfData); HRESULT FreePrivateData(REFGUID refguid); HRESULT GetContainer(REFIID riid, void** ppContainer); D3DSURFACE_DESC GetDesc(); HRESULT LockRect(D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); HRESULT UnlockRect();*/ private: int m_iRefCount; BYTE *m_pData; D3DSURFACE_DESC m_Desc; }; CDirect3DSurface8::CDirect3DSurface8() : m_pData(NULL), m_iRefCount(1) { } CDirect3DSurface8::~CDirect3DSurface8() { delete[] m_pData; } BOOL CDirect3DSurface8::Create(int iWidth, int iHeight) { m_pData = new BYTE[iWidth * iHeight * 4]; if (!m_pData) return FALSE; m_Desc.Format = D3DFMT_A8R8G8B8; m_Desc.Type = D3DRTYPE_SURFACE; m_Desc.Usage = 0; m_Desc.Pool = D3DPOOL_SYSTEMMEM; m_Desc.Size = iWidth * iHeight * 4; m_Desc.MultiSampleType = D3DMULTISAMPLE_NONE; m_Desc.Width = iWidth; m_Desc.Height = iHeight; return TRUE; } STDMETHODIMP_(ULONG) CDirect3DSurface8::AddRef() { return ++m_iRefCount; } STDMETHODIMP CDirect3DSurface8::QueryInterface(REFIID iid, void **ppvObject) { return E_NOINTERFACE; } STDMETHODIMP_(ULONG) CDirect3DSurface8::Release() { if (!--m_iRefCount) { delete this; return 0; } return m_iRefCount; } /////////// Dummy implementations /////////////// STDMETHODIMP CDirect3DSurface8::SetPrivateData(REFGUID riid, CONST VOID *pvData, DWORD cbData, DWORD dwFlags) { return S_OK; } STDMETHODIMP CDirect3DSurface8::GetPrivateData(REFGUID riid, VOID *pvData, DWORD *pcbData) { return S_OK; } STDMETHODIMP CDirect3DSurface8::FreePrivateData(REFGUID riid) { return S_OK; } STDMETHODIMP CDirect3DSurface8::GetContainer(REFIID riid, void **ppContainer) { return S_OK; } STDMETHODIMP CDirect3DSurface8::GetDevice(IDirect3DDevice8 **ppDevice) { return S_OK; } // Required implementation STDMETHODIMP_(D3DSURFACE_DESC) CDirect3DSurface8::GetDesc() { return m_Desc; } // Assume the entire surface is being locked. STDMETHODIMP CDirect3DSurface8::LockRect(D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) { pLockedRect->Pitch = m_Desc.Width * 4; pLockedRect->pBits = m_pData; return S_OK; } STDMETHODIMP CDirect3DSurface8::UnlockRect() { return S_OK; } IDirect3DSurface8 *GetCloneSurface(int iWidth, int iHeight) { CDirect3DSurface8 *pSurf = new CDirect3DSurface8; if (!pSurf) return NULL; if (!pSurf->Create(iWidth, iHeight)) { delete pSurf; return NULL; } return (IDirect3DSurface8*)pSurf; }