MCPcopy Create free account
hub / github.com/LegacyUpdate/LegacyUpdate / ScaleAndWriteToBMP

Function ScaleAndWriteToBMP

shared/LoadImage.c:217–341  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

215}
216
217BOOL 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

Callers 1

CreateRunOnceWindowFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected