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);