windows-nt/Source/XPSP1/NT/multimedia/directx/dinput/diconfig/cd3dsurf.cpp
2020-09-26 16:20:57 +08:00

170 lines
3.6 KiB
C++

#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;
}