| 215 | } |
| 216 | |
| 217 | BOOL ScaleAndWriteToBMP(HBITMAP hBitmap, DWORD width, DWORD height, LPCWSTR outputPath) { |
| 218 | BOOL result = FALSE; |
| 219 | if (!hBitmap) { |
| 220 | TRACE(L"Null bitmap"); |
| 221 | return FALSE; |
| 222 | } |
| 223 | |
| 224 | HDC hdc = GetDC(NULL); |
| 225 | HDC hdcMem = CreateCompatibleDC(hdc); |
| 226 | HDC hdcMemScaled = NULL; |
| 227 | HGLOBAL handle = NULL; |
| 228 | HANDLE file = INVALID_HANDLE_VALUE; |
| 229 | HBITMAP oldBitmap = NULL; |
| 230 | HBITMAP oldScaledBitmap = NULL; |
| 231 | HRESULT hr = S_OK; |
| 232 | |
| 233 | HBITMAP scaledBitmap = CreateCompatibleBitmap(hdc, width, height); |
| 234 | if (!scaledBitmap) { |
| 235 | hr = HRESULT_FROM_WIN32(GetLastError()); |
| 236 | CHECK_HR(L"CreateCompatibleBitmap failed"); |
| 237 | goto end; |
| 238 | } |
| 239 | |
| 240 | BITMAP bmp = {0}; |
| 241 | if (!GetObject(hBitmap, sizeof(BITMAP), &bmp)) { |
| 242 | hr = HRESULT_FROM_WIN32(GetLastError()); |
| 243 | CHECK_HR(L"GetObject failed"); |
| 244 | goto end; |
| 245 | } |
| 246 | |
| 247 | hdcMemScaled = CreateCompatibleDC(hdc); |
| 248 | SetStretchBltMode(hdcMemScaled, HALFTONE); |
| 249 | |
| 250 | oldBitmap = SelectObject(hdcMem, hBitmap); |
| 251 | oldScaledBitmap = SelectObject(hdcMemScaled, scaledBitmap); |
| 252 | |
| 253 | if (!StretchBlt(hdcMemScaled, |
| 254 | 0, 0, width, height, hdcMem, |
| 255 | 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY)) { |
| 256 | hr = HRESULT_FROM_WIN32(GetLastError()); |
| 257 | CHECK_HR(L"StretchBlt failed"); |
| 258 | goto end; |
| 259 | } |
| 260 | |
| 261 | BITMAPINFOHEADER bmih = {0}; |
| 262 | bmih.biSize = sizeof(BITMAPINFOHEADER); |
| 263 | bmih.biWidth = width; |
| 264 | bmih.biHeight = height; |
| 265 | bmih.biPlanes = 1; |
| 266 | bmih.biBitCount = bmp.bmBitsPixel; |
| 267 | bmih.biCompression = BI_RGB; |
| 268 | bmih.biSizeImage = ((width * bmp.bmBitsPixel + 31) / 32) * 4 * height; |
| 269 | |
| 270 | BITMAPFILEHEADER bmfh = {0}; |
| 271 | bmfh.bfType = 0x4D42; |
| 272 | bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER); |
| 273 | bmfh.bfSize = bmfh.bfOffBits + bmih.biSizeImage; |
| 274 |
no outgoing calls
no test coverage detected