From 428acf24ba9887d69a858335660fe158afa8f42c Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Sat, 29 Jul 2023 06:19:30 +0200
Subject: [PATCH] #189 fix freeze on loading screen

---
 inc/dd.h        |  1 +
 src/config.c    |  6 ++++
 src/ddsurface.c | 74 ++++++++++++++++++++++++++-----------------------
 3 files changed, 47 insertions(+), 34 deletions(-)

diff --git a/inc/dd.h b/inc/dd.h
index 996aa04..26d537e 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -183,6 +183,7 @@ typedef struct CNCDDRAW
     DWORD gui_thread_id;
     BOOL rgb555;
     BOOL hook_peekmessage;
+    BOOL dont_emulate_dc;
 
 } CNCDDRAW;
 
diff --git a/src/config.c b/src/config.c
index a00a1dd..3b7903f 100644
--- a/src/config.c
+++ b/src/config.c
@@ -58,6 +58,7 @@ void cfg_load()
     g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE);
     g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE);
     g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", FALSE);
+    g_ddraw->dont_emulate_dc = cfg_get_bool("dont_emulate_dc", FALSE);
     cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir));
 
     if (g_ddraw->locktopleft)
@@ -385,6 +386,7 @@ static void cfg_create_ini()
             "fpupreserve=true\n"
             "dinput_show_cursor=false\n"      
             "no_dinput_hook=false\n"
+            "dont_emulate_dc=false\n"
             "\n"
             "\n"
             "\n"
@@ -826,6 +828,10 @@ static void cfg_create_ini()
             "renderer=opengl\n"
             "noactivateapp=true\n"
             "\n"
+            "; Hooligans: Storm over Europe\n"
+            "[Hooligans]\n"
+            "dont_emulate_dc=true\n"
+            "\n"
             "; Invictus\n"
             "[Invictus]\n"
             "adjmouse=true\n"
diff --git a/src/ddsurface.c b/src/ddsurface.c
index f0caf67..c3e9268 100644
--- a/src/ddsurface.c
+++ b/src/ddsurface.c
@@ -1431,53 +1431,59 @@ HRESULT dd_CreateSurface(
             ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF;
         }
 
-        dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
 
-        dst_surface->mapping =
-            CreateFileMappingA(
-                INVALID_HANDLE_VALUE,
-                NULL,
-                PAGE_READWRITE | SEC_COMMIT,
-                0,
-                bmp_size + 256,
-                NULL);
-
-        DWORD map_offset = 0;
-
-        if (dst_surface->mapping)
+        if (!g_ddraw->dont_emulate_dc)
         {
-            LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
-            if (data)
+            dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
+
+            dst_surface->mapping =
+                CreateFileMappingA(
+                    INVALID_HANDLE_VALUE,
+                    NULL,
+                    PAGE_READWRITE | SEC_COMMIT,
+                    0,
+                    bmp_size + 256,
+                    NULL);
+
+            DWORD map_offset = 0;
+
+            if (dst_surface->mapping)
             {
-                while (((DWORD)data + map_offset) % 128) map_offset++;
-                UnmapViewOfFile(data);
+                LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
+                if (data)
+                {
+                    while (((DWORD)data + map_offset) % 128) map_offset++;
+                    UnmapViewOfFile(data);
+                }
+
+                if (!data || (map_offset % sizeof(DWORD)))
+                {
+                    map_offset = 0;
+                    CloseHandle(dst_surface->mapping);
+                    dst_surface->mapping = NULL;
+                }
             }
 
-            if (!data || (map_offset % sizeof(DWORD)))
-            {
-                map_offset = 0;
-                CloseHandle(dst_surface->mapping);
-                dst_surface->mapping = NULL;
-            }
+            dst_surface->bitmap =
+                CreateDIBSection(
+                    dst_surface->hdc,
+                    dst_surface->bmi,
+                    DIB_RGB_COLORS,
+                    (void**)&dst_surface->surface,
+                    dst_surface->mapping,
+                    map_offset);
         }
 
-        dst_surface->bitmap =
-            CreateDIBSection(
-                dst_surface->hdc,
-                dst_surface->bmi,
-                DIB_RGB_COLORS,
-                (void**)&dst_surface->surface,
-                dst_surface->mapping,
-                map_offset);
-
-        SelectObject(dst_surface->hdc, dst_surface->bitmap);
-
         dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height);
 
         if (!dst_surface->bitmap)
         {
             dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size);
         }
+        else
+        {
+            SelectObject(dst_surface->hdc, dst_surface->bitmap);
+        }
 
         if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
         {