From f9f4b6fb00727817cfbcf897e7d5dfb52a16841a Mon Sep 17 00:00:00 2001 From: narzoul Date: Mon, 29 Jul 2019 23:56:40 +0200 Subject: [PATCH] Fixed bitmap orientation for Create*Bitmap functions Fixes upside-down save game screenshots in Siege of Avalon (issue #42) --- DDrawCompat/Gdi/DcFunctions.cpp | 2 +- DDrawCompat/Gdi/VirtualScreen.cpp | 8 ++++---- DDrawCompat/Gdi/VirtualScreen.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DDrawCompat/Gdi/DcFunctions.cpp b/DDrawCompat/Gdi/DcFunctions.cpp index bed73bf..5e1355e 100644 --- a/DDrawCompat/Gdi/DcFunctions.cpp +++ b/DDrawCompat/Gdi/DcFunctions.cpp @@ -168,7 +168,7 @@ namespace LOG_FUNC("CreateDIBitmap", hdc, lpbmih, fdwInit, lpbInit, lpbmi, fuUsage); if (lpbmih && (!(fdwInit & CBM_INIT) || lpbInit && lpbmi)) { - HBITMAP bitmap = Gdi::VirtualScreen::createOffScreenDib(lpbmih->biWidth, std::abs(lpbmih->biHeight)); + HBITMAP bitmap = Gdi::VirtualScreen::createOffScreenDib(lpbmih->biWidth, lpbmih->biHeight); if (bitmap && (fdwInit & CBM_INIT)) { SetDIBits(hdc, bitmap, 0, std::abs(lpbmih->biHeight), lpbInit, lpbmi, fuUsage); diff --git a/DDrawCompat/Gdi/VirtualScreen.cpp b/DDrawCompat/Gdi/VirtualScreen.cpp index 9a965f7..9fac26c 100644 --- a/DDrawCompat/Gdi/VirtualScreen.cpp +++ b/DDrawCompat/Gdi/VirtualScreen.cpp @@ -36,7 +36,7 @@ namespace return TRUE; } - HBITMAP createDibSection(DWORD width, DWORD height, HANDLE section) + HBITMAP createDibSection(LONG width, LONG height, HANDLE section) { struct BITMAPINFO256 : public BITMAPINFO { @@ -46,7 +46,7 @@ namespace BITMAPINFO256 bmi = {}; bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); bmi.bmiHeader.biWidth = width; - bmi.bmiHeader.biHeight = -static_cast(height); + bmi.bmiHeader.biHeight = height; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = static_cast(g_bpp); bmi.bmiHeader.biCompression = 8 == g_bpp ? BI_RGB : BI_BITFIELDS; @@ -107,10 +107,10 @@ namespace Gdi { return nullptr; } - return createDibSection(g_width, g_height, g_surfaceFileMapping); + return createDibSection(g_width, -g_height, g_surfaceFileMapping); } - HBITMAP createOffScreenDib(DWORD width, DWORD height) + HBITMAP createOffScreenDib(LONG width, LONG height) { Compat::ScopedCriticalSection lock(g_cs); return createDibSection(width, height, nullptr); diff --git a/DDrawCompat/Gdi/VirtualScreen.h b/DDrawCompat/Gdi/VirtualScreen.h index b0b4614..dfdfecd 100644 --- a/DDrawCompat/Gdi/VirtualScreen.h +++ b/DDrawCompat/Gdi/VirtualScreen.h @@ -14,7 +14,7 @@ namespace Gdi { HDC createDc(); HBITMAP createDib(); - HBITMAP createOffScreenDib(DWORD width, DWORD height); + HBITMAP createOffScreenDib(LONG width, LONG height); CompatPtr createSurface(const RECT& rect); void deleteDc(HDC dc);