1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

#189 fix freeze on loading screen

This commit is contained in:
FunkyFr3sh 2023-07-29 06:19:30 +02:00
parent 5a928caa70
commit 428acf24ba
3 changed files with 47 additions and 34 deletions

View File

@ -183,6 +183,7 @@ typedef struct CNCDDRAW
DWORD gui_thread_id; DWORD gui_thread_id;
BOOL rgb555; BOOL rgb555;
BOOL hook_peekmessage; BOOL hook_peekmessage;
BOOL dont_emulate_dc;
} CNCDDRAW; } CNCDDRAW;

View File

@ -58,6 +58,7 @@ void cfg_load()
g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE); g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE);
g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE); g_ddraw->rgb555 = cfg_get_bool("rgb555", FALSE);
g_ddraw->hook_peekmessage = cfg_get_bool("hook_peekmessage", 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)); cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir));
if (g_ddraw->locktopleft) if (g_ddraw->locktopleft)
@ -385,6 +386,7 @@ static void cfg_create_ini()
"fpupreserve=true\n" "fpupreserve=true\n"
"dinput_show_cursor=false\n" "dinput_show_cursor=false\n"
"no_dinput_hook=false\n" "no_dinput_hook=false\n"
"dont_emulate_dc=false\n"
"\n" "\n"
"\n" "\n"
"\n" "\n"
@ -826,6 +828,10 @@ static void cfg_create_ini()
"renderer=opengl\n" "renderer=opengl\n"
"noactivateapp=true\n" "noactivateapp=true\n"
"\n" "\n"
"; Hooligans: Storm over Europe\n"
"[Hooligans]\n"
"dont_emulate_dc=true\n"
"\n"
"; Invictus\n" "; Invictus\n"
"[Invictus]\n" "[Invictus]\n"
"adjmouse=true\n" "adjmouse=true\n"

View File

@ -1431,53 +1431,59 @@ HRESULT dd_CreateSurface(
((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF;
} }
dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
dst_surface->mapping = if (!g_ddraw->dont_emulate_dc)
CreateFileMappingA(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE | SEC_COMMIT,
0,
bmp_size + 256,
NULL);
DWORD map_offset = 0;
if (dst_surface->mapping)
{ {
LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc);
if (data)
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++; LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
UnmapViewOfFile(data); 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))) dst_surface->bitmap =
{ CreateDIBSection(
map_offset = 0; dst_surface->hdc,
CloseHandle(dst_surface->mapping); dst_surface->bmi,
dst_surface->mapping = NULL; 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); dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height);
if (!dst_surface->bitmap) if (!dst_surface->bitmap)
{ {
dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size); dst_surface->surface = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmp_size);
} }
else
{
SelectObject(dst_surface->hdc, dst_surface->bitmap);
}
if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE)
{ {