From 428acf24ba9887d69a858335660fe158afa8f42c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh 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) {