BGRATextureView.cpp
1 #include "pch.h" 2 3 #include "BGRATextureView.h" 4 5 #if defined(DEBUG_TEXTURE) 6 void BGRATextureView::SaveAsBitmap(const char* filename) const 7 { 8 wil::unique_hbitmap bitmap{ CreateBitmap(static_cast<int>(pitch), static_cast<int>(height), 1, 32, pixels) }; 9 const HBITMAP hBitmap = bitmap.get(); 10 DWORD dwPaletteSize = 0, dwBmBitsSize = 0, dwDIBSize = 0, dwWritten = 0; 11 LPBITMAPINFOHEADER lpBitmapInfo; 12 HANDLE hDib, hPal, hOldPal2 = NULL; 13 HDC hDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); 14 const int iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES); 15 DeleteDC(hDC); 16 WORD wBitCount = 24; 17 if (iBits <= 1) 18 wBitCount = 1; 19 else if (iBits <= 4) 20 wBitCount = 4; 21 else if (iBits <= 8) 22 wBitCount = 8; 23 24 BITMAP Bitmap0; 25 GetObject(hBitmap, sizeof(Bitmap0), (LPSTR)&Bitmap0); 26 BITMAPINFOHEADER bi = {}; 27 bi.biSize = sizeof(BITMAPINFOHEADER); 28 bi.biWidth = Bitmap0.bmWidth; 29 bi.biHeight = -Bitmap0.bmHeight; 30 bi.biPlanes = 1; 31 bi.biBitCount = wBitCount; 32 bi.biCompression = BI_RGB; 33 bi.biClrUsed = 256; 34 dwBmBitsSize = ((Bitmap0.bmWidth * wBitCount + 31) & ~31) / 8 * Bitmap0.bmHeight; 35 hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER)); 36 lpBitmapInfo = (LPBITMAPINFOHEADER)GlobalLock(hDib); 37 *lpBitmapInfo = bi; 38 39 hPal = GetStockObject(DEFAULT_PALETTE); 40 if (hPal) 41 { 42 hDC = GetDC(NULL); 43 hOldPal2 = SelectPalette(hDC, (HPALETTE)hPal, FALSE); 44 RealizePalette(hDC); 45 } 46 47 GetDIBits(hDC, hBitmap, 0, (UINT)Bitmap0.bmHeight, (LPSTR)lpBitmapInfo + sizeof(BITMAPINFOHEADER) + dwPaletteSize, (BITMAPINFO*)lpBitmapInfo, DIB_RGB_COLORS); 48 49 if (hOldPal2) 50 { 51 SelectPalette(hDC, (HPALETTE)hOldPal2, TRUE); 52 RealizePalette(hDC); 53 ReleaseDC(NULL, hDC); 54 } 55 56 wil::unique_handle fh{ CreateFileA(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL) }; 57 58 if (!fh) 59 return; 60 61 BITMAPFILEHEADER bitmapFileHeader = {}; 62 bitmapFileHeader.bfType = 0x4D42; // "BM" 63 dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; 64 bitmapFileHeader.bfSize = dwDIBSize; 65 bitmapFileHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize; 66 67 WriteFile(fh.get(), (LPSTR)&bitmapFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL); 68 69 WriteFile(fh.get(), (LPSTR)lpBitmapInfo, dwDIBSize, &dwWritten, NULL); 70 GlobalUnlock(hDib); 71 GlobalFree(hDib); 72 } 73 #endif