#include "bmpUtil.h" #include #include HPALETTE bmpUtil_getDIBPalette(LPBITMAPINFO bmpInfo, unsigned int colours) { LPBITMAPINFOHEADER bmpHeader; LPLOGPALETTE logicalPalette; HPALETTE reply = 0; bmpHeader = (LPBITMAPINFOHEADER) bmpInfo; MessageBox(0, "A", "A", MB_OK); if (colours) { MessageBox(0, "A", "A", MB_OK); logicalPalette = (LPLOGPALETTE) GlobalAlloc(GMEM_FIXED, sizeof (LOGPALETTE) + sizeof(PALETTEENTRY) * (colours)); if (logicalPalette == NULL) { return reply; } logicalPalette->palVersion = 0x300; logicalPalette->palNumEntries = colours; MessageBox(0, "A", "A", MB_OK); for (int i = 0; i < colours; i ++) { logicalPalette->palPalEntry[i].peRed = bmpInfo->bmiColors[i].rgbRed; logicalPalette->palPalEntry[i].peGreen = bmpInfo->bmiColors[i].rgbGreen; logicalPalette->palPalEntry[i].peBlue = bmpInfo->bmiColors[i].rgbBlue; logicalPalette->palPalEntry[i].peFlags = 0; } reply = CreatePalette(logicalPalette); GlobalFree((HGLOBAL) logicalPalette); } return reply; } HBITMAP _export bmpUtil_loadBitmap(HDC device, char *filename) { BYTE dummy[2]; BITMAPINFO bitmapInfo; OFSTRUCT of; HFILE file; BITMAPFILEHEADER fileHeader; LPRGBQUAD colours; LPBITMAPINFO bitmapData; LPBYTE image; unsigned int colourCount; HBITMAP reply; char buffer[40]; file = OpenFile(filename, &of, OF_READ); if (!file) { return NULL; } if (!_lread(file, &fileHeader, sizeof(BITMAPFILEHEADER))) { MessageBox(0, "M1", "M", MB_OK); } if (!_lread(file, &bitmapInfo.bmiHeader, 40)) { MessageBox(0, "M2", "M", MB_OK); } colourCount = 1 << bitmapInfo.bmiHeader.biBitCount; bitmapData = (BITMAPINFO *) GlobalAlloc(GMEM_FIXED, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * colourCount); if (!bitmapData) { MessageBox(0, "M3", "M", MB_OK); } bitmapData->bmiHeader = bitmapInfo.bmiHeader; colours = (RGBQUAD *) &bitmapData->bmiColors; if (_lread(file, colours, sizeof(RGBQUAD) * colourCount) < colourCount) { MessageBox(0, "M4", "M", MB_OK); } image = (BYTE FAR *) GlobalAlloc(GMEM_FIXED, sizeof(BYTE) * bitmapData->bmiHeader.biSizeImage); if (!image) { MessageBox(0, "M5", "M", MB_OK); } if (_lread(file, image, sizeof(BYTE) * bitmapData->bmiHeader.biSizeImage) < bitmapData->bmiHeader.biSizeImage) { MessageBox(0, "M", "M6", MB_OK); } HPALETTE pal = bmpUtil_getDIBPalette(bitmapData, colourCount); sprintf(buffer, "%d", (int) pal); MessageBox(0, buffer, "M0", MB_OK); reply = CreateCompatibleBitmap (device, 501, 228); sprintf(buffer, "%d", reply); MessageBox(0, buffer, "M1", MB_OK); if (reply != NULL) { int r = SetDIBits(device, reply, 0, bitmapData->bmiHeader.biHeight, image, bitmapData, DIB_RGB_COLORS); sprintf(buffer, "%d", r); MessageBox(0, buffer, "M2", MB_OK); DeleteObject(reply); } reply = CreateDIBitmap( device, &bitmapData->bmiHeader, CBM_INIT, image, bitmapData, DIB_RGB_COLORS); sprintf(buffer, "%d", reply); MessageBox(0, buffer, "M", MB_OK); GlobalFree((HLOCAL) bitmapData); GlobalFree((HLOCAL) image); _lclose(file); return reply; }