1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
void d3d_MakeScreenShotBMP(const char *pFilename, uint32 nWidth, uint32 nHeight)
{
ilInit(); // pour initialiser IL
int len = strlen(pFilename) + 1;
LPDIRECT3DSURFACE8 pBackBuffer = NULL;
D3DSURFACE_DESC SurfDesc;
if (FAILED(PD3DDEVICE->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer)))
{
return;
}
pBackBuffer->GetDesc(&SurfDesc);
uint32 imageSize = nWidth * nHeight;
// Lock the back buffer.
D3DLOCKED_RECT LockRect;
HRESULT hResult;
if (FAILED(hResult = pBackBuffer->LockRect(&LockRect, NULL, NULL)))
{
dsi_ConsolePrint("MakeScreenShotBMP: g_pOffscreen->Lock returned %d.", hResult);
return;
}
if (FAILED(pBackBuffer->UnlockRect()))
{
// dsi_ConsolePrint("MakeScreenShotBMP: FormatMgr::ConvertPixels returned %d.", dResult);
return;
}
unsigned int id;
ilGenImages(1, &id);
ilBindImage(id); // LockRect.pBits
uint8 *data;
data = new uint8[imageSize*4];
uint8 *m_pSrc;
m_pSrc = (uint8*)LockRect.pBits; // car pBits est un void *
for (uint32 y=0; y < nHeight; ++y) // parcours des lignes, ok ! 640
{
uint8 *pOutBuf = &m_pSrc[(nHeight-y-1) * nWidth*4]; // pour recuperer la ligne
uint8 *pImageLine = &data[y*nWidth*4];
memcpy(pImageLine, pOutBuf, nWidth*4);
}
ilTexImage(nWidth, nHeight, 1, 4, IL_BGRA, IL_BYTE, data);
ilSave(IL_JPG, pFilename);
ilDeleteImages(1, &id);
} |
Partager