#include "pch.h"
DWORD MakeMask(int bits, int shift)
{
return ((1 << bits) - 1) << shift;
}
HRESULT DDPixelFormat::SetFormat(IDirectDrawX* pdd, HDC hdc, HBITMAP hbitmap, IDirectDrawPalette** pppalette)
{
BYTE ajBitmapInfo[sizeof(BITMAPINFO) + 3*sizeof(DWORD)];
BITMAPINFO *pbmi = (BITMAPINFO *) ajBitmapInfo;
BOOL bRet = FALSE;
memset(pbmi, 0, sizeof(ajBitmapInfo));
pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
ZVerify(::GetDIBits(hdc, hbitmap, 0, 0, NULL, pbmi, DIB_RGB_COLORS));
dwFlags = DDPF_RGB;
dwRGBBitCount = pbmi->bmiHeader.biBitCount;
dwRGBAlphaBitMask = 0;
switch(pbmi->bmiHeader.biCompression) {
case BI_RGB:
switch (dwRGBBitCount) {
case 4:
case 8:
{
dwFlags |= ((dwRGBBitCount == 4) ? DDPF_PALETTEINDEXED4 : DDPF_PALETTEINDEXED8);
RGBQUAD prgb[256];
int ncolors = GetDIBColorTable(hdc, 0, 256, prgb);
ZAssert(ncolors == (1 << dwRGBBitCount));
PALETTEENTRY ppe[256];
for (int index = 0; index < ncolors; index++) {
ppe[index].peRed = prgb[index].rgbRed;
ppe[index].peGreen = prgb[index].rgbGreen;
ppe[index].peBlue = prgb[index].rgbBlue;
}
DDCall(pdd->CreatePalette(
(dwRGBBitCount == 4) ? DDPCAPS_4BIT : DDPCAPS_8BIT,
ppe,
pppalette,
NULL
));
return S_OK;
}
case 16:
dwRBitMask = MakeMask(5, 10);
dwGBitMask = MakeMask(5, 5);
dwBBitMask = MakeMask(5, 0);
return S_OK;
case 24:
case 32:
dwRBitMask = MakeMask(8, 16);
dwGBitMask = MakeMask(8, 8);
dwBBitMask = MakeMask(8, 0);
return S_OK;
}
break;
case BI_BITFIELDS:
ZVerify(::GetDIBits(hdc, hbitmap, 0, pbmi->bmiHeader.biHeight, NULL, pbmi, DIB_RGB_COLORS));
dwRBitMask = *(DWORD *)&pbmi->bmiColors[0];
dwGBitMask = *(DWORD *)&pbmi->bmiColors[1];
dwBBitMask = *(DWORD *)&pbmi->bmiColors[2];
return S_OK;
}
ZError("Unknown bitmap pixel format");
return E_FAIL;
}