19,472
社区成员




class CSurface
{
protected:
LPDIRECTDRAW m_pdd;
LPDDSURFACEDESC m_pddsd;
LPDIRECTDRAWSURFACE m_pdds;
public:
CSurface();
virtual ~CSurface();
bool Create(void);
bool Lock(void);
bool Unlock(void);
void Release(void);
public:
DWORD m_dwBitCount;
DWORD m_dwWidth;
DWORD m_dwHeight;
DWORD m_dwLinearSize;
DWORD m_dwSize;
PPALETTEENTRY m_ppePalette;
PBYTE m_pData;
};
CSurface::CSurface()
{
m_pdd = NULL;
m_pdds = NULL;
m_pddsd = new DDSURFACEDESC;
m_ppePalette = new PALETTEENTRY[0x100];
if ((m_pddsd == NULL) || (m_ppePalette == NULL))
return;
if (DirectDrawCreate(NULL, &m_pdd, NULL) != DD_OK)
{
m_pdd = NULL;
return;
}
if (m_pdd->SetCooperativeLevel(NULL, DDSCL_NORMAL) != DD_OK)
{
m_pdd = NULL;
return;
}
}
CSurface::~CSurface()
{
Release();
delete m_pddsd;
delete m_ppePalette;
}
bool CSurface::Create()
{
if (m_pdd == NULL)
return false;
m_pddsd->dwSize = sizeof(DDSURFACEDESC);
m_pddsd->dwFlags = DDSD_CAPS;
m_pddsd->ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if (m_pdd->CreateSurface(m_pddsd, &m_pdds, NULL) != DD_OK)
return false;
if (m_pdds->Lock(NULL, m_pddsd, DDLOCK_WAIT | DDLOCK_READONLY, NULL) != DD_OK)
{
m_pdds->Release();
return false;
}
m_pdds->Unlock(NULL);
m_dwWidth = m_pddsd->dwWidth;
m_dwHeight = m_pddsd->dwHeight;
m_dwLinearSize = m_pddsd->dwLinearSize;
m_dwSize = m_dwLinearSize*m_dwHeight;
m_dwBitCount = m_pddsd->ddpfPixelFormat.dwRGBBitCount;
if (m_dwBitCount <= 8)
{
HDC hDC;
int nPaletteLength;
bool bResult;
if (m_pdds->GetDC(&hDC) != DD_OK)
{
m_pdds->Release();
return false;
}
if (m_dwBitCount == 8)
nPaletteLength = 256;
else
nPaletteLength = 16;
bResult = (::GetSystemPaletteEntries(hDC, 0, nPaletteLength, m_ppePalette) != 0);
m_pdds->ReleaseDC(hDC);
if (!bResult)
{
m_pdds->Release();
return false;
}
}
return true;
}
void CSurface::Release()
{
if (m_pdds != NULL)
m_pdds->Release();
m_pdds = NULL;
}
bool CSurface::Lock()
{
if ((m_pdd == NULL) || (m_pdds == NULL))
return false;
if (m_pdds->Lock(NULL, m_pddsd, DDLOCK_WAIT | DDLOCK_READONLY, NULL) != DD_OK)
return false;
m_pData = (PBYTE)m_pddsd->lpSurface;
m_pdds->Unlock(NULL);
return true;
}