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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#define RGB16BMP(red, green, blue) ( ((red >> 3) << 10) | ((green >> 3) << 5) | (blue >> 3))
HRESULT Generate16BitsFrom32Bits(IDirect3DDevice9* pDevice9, IDirect3DTexture9* pImageTexture){
HRESULT hr = S_OK;
IDirect3DTexture9* p16BitsTexture = NULL;
D3DSURFACE_DESC desc;
D3DLOCKED_RECT lrIn;
D3DLOCKED_RECT lrOut;
BYTE* pDataIn;
USHORT* pDataOut;
USHORT usPixel;
BYTE r, g, b;
UINT uiPitchIn;
UINT uiPitchOut;
hr = pImageTexture->GetLevelDesc(0, &desc);
// desc.Format doit être D3DFMT_A8R8G8B8
// assert(desc.Format == D3DFMT_A8R8G8B8);
hr = pDevice9->CreateTexture(desc.Width, desc.Height, 1, D3DUSAGE_DYNAMIC, D3DFMT_X1R5G5B5, D3DPOOL_DEFAULT, &p16BitsTexture, NULL);
hr = pImageTexture->LockRect(0, &lrIn, NULL, 0);
hr = p16BitsTexture->LockRect(0, &lrOut, NULL, 0);
pDataIn = (BYTE*)lrIn.pBits;
pDataOut = (USHORT*)lrOut.pBits;
// En général lrIn.Pitch = desc.Width * 4, donc uiPitchIn vaut 0
// Si lrIn.Pitch > desc.Width * 4, alors il faudrait vérifier la validité de cette ligne ci-dessous...
uiPitchIn = lrIn.Pitch - ((INT)(desc.Width * 4.0f));
uiPitchOut = lrOut.Pitch - ((INT)(desc.Width * 2.0f));
uiPitchOut = UINT(uiPitchOut / 2.0f);
for(UINT ui = 0; ui < desc.Height; ui++){
for(UINT ui2 = 0; ui2 < desc.Width; ui2++){
b = *pDataIn++;
g = *pDataIn++;
r = *pDataIn++;
*pDataIn++;// Alpha
usPixel = RGB16BMP(r, g, b);
*pDataOut++ = usPixel;
}
// Normalement uiPitchIn = 0...
pDataIn += uiPitchIn;
pDataOut += uiPitchOut;
}
hr = pImageTexture->UnlockRect(0);
hr = p16BitsTexture->UnlockRect(0);
hr = D3DXSaveTextureToFile(L"Image16bits.bmp", D3DXIFF_BMP, p16BitsTexture, NULL);
p16BitsTexture->Release();
return hr;
} |
Partager