diff --git a/inc/hook.h b/inc/hook.h index 733deeb..f40aed5 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -37,6 +37,8 @@ typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); +typedef int (WINAPI* STRETCHDIBITSPROC)( + HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); @@ -70,6 +72,7 @@ extern MAPWINDOWPOINTSPROC real_MapWindowPoints; extern SHOWWINDOWPROC real_ShowWindow; extern STRETCHBLTPROC real_StretchBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; +extern STRETCHDIBITSPROC real_StretchDIBits; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern LOADLIBRARYAPROC real_LoadLibraryA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index e97bb24..6b47029 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,8 @@ BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); int WINAPI fake_SetDIBitsToDevice( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); +int WINAPI fake_StretchDIBits( + HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags); diff --git a/src/hook.c b/src/hook.c index 185565b..1c2ebf8 100644 --- a/src/hook.c +++ b/src/hook.c @@ -42,6 +42,7 @@ MAPWINDOWPOINTSPROC real_MapWindowPoints = MapWindowPoints; SHOWWINDOWPROC real_ShowWindow = ShowWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; +STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; @@ -86,6 +87,7 @@ static HOOKLIST g_hooks[] = { { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 | SKIP_HOOK3 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 | SKIP_HOOK3 }, + { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 | SKIP_HOOK3 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, SKIP_HOOK3 }, { "", NULL, NULL, 0 } } diff --git a/src/render_gdi.c b/src/render_gdi.c index f0f9d85..9fe62a1 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -110,7 +110,7 @@ DWORD WINAPI gdi_render_main(void) } else if (upscale_hack) { - StretchDIBits( + real_StretchDIBits( g_ddraw->render.hdc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, @@ -128,7 +128,7 @@ DWORD WINAPI gdi_render_main(void) else if (!g_ddraw->child_window_exists && (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) { - StretchDIBits( + real_StretchDIBits( g_ddraw->render.hdc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 29e754a..5d38ed1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,6 +647,88 @@ int WINAPI fake_SetDIBitsToDevice( return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); } +int WINAPI fake_StretchDIBits( + HDC hdc, + int xDest, + int yDest, + int DestWidth, + int DestHeight, + int xSrc, + int ySrc, + int SrcWidth, + int SrcHeight, + const VOID* lpBits, + const BITMAPINFO* lpbmi, + UINT iUsage, + DWORD rop) +{ + if (g_ddraw && WindowFromDC(hdc) == g_ddraw->hwnd) + { + if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + if (primary_dc) + { + int result = + real_StretchDIBits( + primary_dc, + xDest, + yDest, + DestWidth, + DestHeight, + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); + + dds_ReleaseDC(g_ddraw->primary, primary_dc); + + return result; + } + } + else if (g_ddraw->width > 0) + { + return + real_StretchDIBits( + hdc, + xDest + g_ddraw->render.viewport.x, + yDest + g_ddraw->render.viewport.y, + (int)(DestWidth * g_ddraw->render.scale_w), + (int)(DestHeight * g_ddraw->render.scale_h), + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); + } + } + + return + real_StretchDIBits( + hdc, + xDest, + yDest, + DestWidth, + DestHeight, + xSrc, + ySrc, + SrcWidth, + SrcHeight, + lpBits, + lpbmi, + iUsage, + rop); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod = real_LoadLibraryA(lpLibFileName);