98 lines
2.9 KiB
C++
98 lines
2.9 KiB
C++
#include <windows.h>
|
||
#include "ibitmap.h"
|
||
|
||
#ifndef _VIDPOOL_H
|
||
#define _VIDPOOL_H
|
||
|
||
// {36447655-7089-11d0-BC25-00AA00A13C86}
|
||
DEFINE_GUID(BFID_PRIVATEDIB, 0x36447655, 0x7089, 0x11d0, 0xbc, 0x25, 0x0, 0xaa, 0x0, 0xa1, 0x3c, 0x86);
|
||
|
||
class CVidPool;
|
||
|
||
class CBitmap :
|
||
public IBitmapSurface
|
||
{
|
||
private:
|
||
LONG m_cRef;
|
||
|
||
public:
|
||
LPBYTE m_bits;
|
||
LONG m_pitch;
|
||
int m_lockcount;
|
||
BOOL m_ext;
|
||
CBitmap* m_next;
|
||
CVidPool* m_factory;
|
||
void *m_refdata;
|
||
|
||
CBitmap() {m_cRef = 0; m_bits = NULL; m_pitch = 0; m_lockcount = 0; m_ext = FALSE;
|
||
m_next = NULL; m_factory = NULL; m_refdata = NULL;}
|
||
|
||
// IUnknown methods
|
||
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
|
||
virtual STDMETHODIMP_(ULONG) AddRef(void);
|
||
virtual STDMETHODIMP_(ULONG) Release(void);
|
||
|
||
// IBitmapSurface methods
|
||
virtual STDMETHODIMP Clone(IBitmapSurface** ppBitmapSurface);
|
||
virtual STDMETHODIMP GetFormat(BFID* pBFID);
|
||
virtual STDMETHODIMP GetFactory(IBitmapSurfaceFactory** ppBitmapSurfaceFactory);
|
||
virtual STDMETHODIMP GetSize(long* pWidth, long* pHeight);
|
||
virtual STDMETHODIMP LockBits(RECT* prcBounds, DWORD dwLockFlags, void** ppBits, long* pPitch);
|
||
virtual STDMETHODIMP UnlockBits(RECT* prcBounds, void* pBits);
|
||
};
|
||
|
||
|
||
typedef void (NotifyAddingToFreeProc) (CBitmap *pBitmap, DWORD_PTR refdata);
|
||
|
||
class CVidPool :
|
||
public IBitmapSurfaceFactory
|
||
{
|
||
private:
|
||
LONG m_cRef;
|
||
BOOL m_growable;
|
||
LONG m_nbufs;
|
||
CBitmap* m_free;
|
||
int m_pitch;
|
||
BFID* m_format;
|
||
CRITICAL_SECTION m_cs;
|
||
LPBITMAPINFOHEADER m_pbmh;
|
||
|
||
public:
|
||
NotifyAddingToFreeProc *m_pAddingToFree;
|
||
DWORD_PTR m_refdata;
|
||
|
||
CVidPool(void);
|
||
|
||
// IUnknown methods
|
||
virtual STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj);
|
||
virtual STDMETHODIMP_(ULONG) AddRef(void);
|
||
virtual STDMETHODIMP_(ULONG) Release(void);
|
||
|
||
// IBitmapSurfaceFactory methods
|
||
virtual STDMETHODIMP CreateBitmapSurface(long width, long height, BFID* pBFID, DWORD dwHintFlags, IBitmapSurface** ppBitmapSurface);
|
||
virtual STDMETHODIMP GetSupportedFormatsCount(long* pcFormats);
|
||
virtual STDMETHODIMP GetSupportedFormats(long cFormats, BFID* pBFIDs);
|
||
|
||
// private to implementation of CVidPool
|
||
STDMETHODIMP InitPool(int nBuffers, LPBITMAPINFOHEADER lpcap);
|
||
STDMETHODIMP AddExternalBuffer(void* pBits, void* refdata);
|
||
STDMETHODIMP GetBuffer(CBitmap** ppBitmap, void** prefdata);
|
||
STDMETHODIMP GetBuffer(IBitmapSurface** ppBitmap, void** prefdata);
|
||
|
||
void AddToFreeList(CBitmap* pBitmap);
|
||
|
||
BOOL Growable(void) { return m_growable; }
|
||
BFID* GetFormat(void) {return m_format;}
|
||
long GetWidth(void) { if (m_pbmh)
|
||
return m_pbmh->biWidth;
|
||
else
|
||
return 0; }
|
||
long GetHeight(void) { if (m_pbmh)
|
||
return m_pbmh->biHeight;
|
||
else
|
||
return 0; }
|
||
};
|
||
|
||
#endif // #ifndef _VIDPOOL_H
|
||
|
||
|