1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00
cnc-ddraw/src/render_gdi.c

174 lines
5.4 KiB
C
Raw Normal View History

2020-10-13 09:20:52 +02:00
#include <windows.h>
#include <stdio.h>
#include "fps_limiter.h"
2020-10-13 09:20:52 +02:00
#include "dd.h"
#include "ddsurface.h"
#include "opengl_utils.h"
#include "utils.h"
#include "wndproc.h"
2022-10-03 12:42:22 +02:00
#include "hook.h"
2020-10-13 10:15:42 +02:00
#include "debug.h"
2023-09-22 00:38:42 +02:00
#include "config.h"
2020-10-13 09:20:52 +02:00
DWORD WINAPI gdi_render_main(void)
{
static DWORD warning_end_tick = 0;
static char warning_text[512] = { 0 };
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
if (g_ddraw.show_driver_warning)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
g_ddraw.show_driver_warning = FALSE;
2020-10-13 09:20:52 +02:00
2022-09-28 21:36:28 +02:00
TRACE(" Switched to GDI renderer\n");
warning_end_tick = timeGetTime() + (15 * 1000);
2023-09-22 00:38:42 +02:00
if (!g_config.windowed)
2024-03-22 22:27:00 +01:00
PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0);
2020-10-13 09:20:52 +02:00
_snprintf(
2021-06-11 20:30:43 +02:00
warning_text,
2023-10-14 05:04:36 +02:00
sizeof(warning_text) - 1,
2021-06-11 20:30:43 +02:00
"-WARNING- Using slow software rendering, please update your graphics card driver (%s)",
2020-10-13 09:20:52 +02:00
strlen(g_oglu_version) > 10 ? "" : g_oglu_version);
}
Sleep(500);
fpsl_init();
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE;
2020-10-18 02:40:45 +02:00
2024-03-22 22:27:00 +01:00
while (g_ddraw.render.run &&
(g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED))
2020-10-13 09:20:52 +02:00
{
#if _DEBUG
2020-10-13 10:15:42 +02:00
dbg_draw_frame_info_start();
2020-10-13 09:20:52 +02:00
#endif
fpsl_frame_start();
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
EnterCriticalSection(&g_ddraw.cs);
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
if (g_ddraw.primary &&
g_ddraw.primary->bpp == g_ddraw.bpp &&
g_ddraw.primary->width == g_ddraw.width &&
g_ddraw.primary->height == g_ddraw.height &&
(g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette))
2020-10-13 09:20:52 +02:00
{
2023-09-22 00:38:42 +02:00
if (g_config.lock_surfaces)
2024-03-22 22:27:00 +01:00
EnterCriticalSection(&g_ddraw.primary->cs);
2022-09-17 13:46:45 +02:00
if (warning_end_tick)
2020-10-13 09:20:52 +02:00
{
if (timeGetTime() < warning_end_tick)
{
2021-05-22 14:23:26 +02:00
HDC primary_dc;
2024-03-22 22:27:00 +01:00
dds_GetDC(g_ddraw.primary, &primary_dc);
2021-05-22 14:23:26 +02:00
2024-03-22 22:27:00 +01:00
RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height };
2021-05-22 12:23:25 +02:00
DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER);
2020-10-13 09:20:52 +02:00
}
else
2020-10-13 21:58:04 +02:00
{
warning_end_tick = 0;
2020-10-13 21:58:04 +02:00
}
2020-10-13 09:20:52 +02:00
}
2023-09-22 00:38:42 +02:00
BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen();
2020-10-13 09:20:52 +02:00
2023-09-22 00:38:42 +02:00
if (g_config.vhack)
2024-03-22 22:27:00 +01:00
InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack);
2020-10-13 09:20:52 +02:00
2023-09-22 00:38:42 +02:00
if (g_config.fixchilds)
2021-08-10 14:12:06 +02:00
{
2024-03-22 22:27:00 +01:00
g_ddraw.child_window_exists = FALSE;
InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL);
EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary);
2021-08-10 14:12:06 +02:00
}
2020-10-13 09:20:52 +02:00
2024-03-22 22:27:00 +01:00
if (g_ddraw.bpp == 8 && g_ddraw.primary->palette)
2021-05-22 14:23:26 +02:00
{
2024-03-22 22:27:00 +01:00
memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int));
2021-05-22 14:23:26 +02:00
}
2024-03-22 22:27:00 +01:00
if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE))
{
2024-03-22 22:27:00 +01:00
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
2024-03-22 22:27:00 +01:00
if (g_ddraw.bnet_active)
2020-10-13 09:20:52 +02:00
{
2024-03-22 22:27:00 +01:00
RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height };
FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
2020-10-13 09:20:52 +02:00
}
2021-05-15 02:58:07 +02:00
else if (upscale_hack)
2020-10-13 09:20:52 +02:00
{
2022-10-05 22:33:53 +02:00
real_StretchDIBits(
2024-03-22 22:27:00 +01:00
g_ddraw.render.hdc,
g_ddraw.render.viewport.x,
g_ddraw.render.viewport.y,
g_ddraw.render.viewport.width,
g_ddraw.render.viewport.height,
2021-06-11 20:30:43 +02:00
0,
2024-03-22 22:27:00 +01:00
g_ddraw.height - g_ddraw.upscale_hack_height,
g_ddraw.upscale_hack_width,
g_ddraw.upscale_hack_height,
g_ddraw.primary->surface,
g_ddraw.primary->bmi,
2021-06-11 20:30:43 +02:00
DIB_RGB_COLORS,
2020-10-13 09:20:52 +02:00
SRCCOPY);
}
2024-03-22 22:27:00 +01:00
else if (!g_ddraw.child_window_exists &&
(g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height))
2020-10-13 09:20:52 +02:00
{
2022-10-05 22:33:53 +02:00
real_StretchDIBits(
2024-03-22 22:27:00 +01:00
g_ddraw.render.hdc,
g_ddraw.render.viewport.x,
g_ddraw.render.viewport.y,
g_ddraw.render.viewport.width,
g_ddraw.render.viewport.height,
2021-06-11 20:30:43 +02:00
0,
0,
2024-03-22 22:27:00 +01:00
g_ddraw.width,
g_ddraw.height,
g_ddraw.primary->surface,
g_ddraw.primary->bmi,
2021-06-11 20:30:43 +02:00
DIB_RGB_COLORS,
2020-10-13 09:20:52 +02:00
SRCCOPY);
}
else
{
2022-10-03 12:42:22 +02:00
real_SetDIBitsToDevice(
2024-03-22 22:27:00 +01:00
g_ddraw.render.hdc,
2021-06-11 20:30:43 +02:00
0,
0,
2024-03-22 22:27:00 +01:00
g_ddraw.width,
g_ddraw.height,
2021-06-11 20:30:43 +02:00
0,
0,
0,
2024-03-22 22:27:00 +01:00
g_ddraw.height,
g_ddraw.primary->surface,
g_ddraw.primary->bmi,
2021-05-22 14:23:26 +02:00
DIB_RGB_COLORS);
2021-06-11 20:30:43 +02:00
}
2022-09-17 13:46:45 +02:00
2023-09-22 00:38:42 +02:00
if (g_config.lock_surfaces)
2024-03-22 22:27:00 +01:00
LeaveCriticalSection(&g_ddraw.primary->cs);
2020-10-13 09:20:52 +02:00
}
2024-03-22 22:27:00 +01:00
LeaveCriticalSection(&g_ddraw.cs);
2020-10-13 09:20:52 +02:00
#if _DEBUG
2020-10-13 10:15:42 +02:00
dbg_draw_frame_info_end();
2020-10-13 09:20:52 +02:00
#endif
fpsl_frame_end();
2020-10-13 09:20:52 +02:00
}
return TRUE;
}