1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

#111 clear screen on resolution change and window resize

This commit is contained in:
FunkyFr3sh 2021-08-05 00:26:29 +02:00
parent 4cd10d6ac0
commit b3f9e7d045
6 changed files with 22 additions and 7 deletions

View File

@ -83,6 +83,7 @@ typedef struct CNCDDRAW
LONG palette_updated;
LONG surface_updated;
LONG clear_screen;
float scale_w;
float scale_h;

View File

@ -763,6 +763,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
if (g_ddraw->render.thread == NULL)
{
if (g_ddraw->maintas || g_ddraw->boxing)
{
InterlockedExchange(&g_ddraw->render.clear_screen, TRUE);
}
InterlockedExchange(&g_ddraw->render.palette_updated, TRUE);
InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);

View File

@ -416,6 +416,11 @@ DWORD WINAPI d3d9_render_main(void)
}
}
if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
{
IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
}
g_ddraw->child_window_exists = FALSE;
EnumChildWindows(g_ddraw->hwnd, util_enum_child_proc, (LPARAM)g_ddraw->primary);

View File

@ -80,6 +80,12 @@ DWORD WINAPI gdi_render_main(void)
memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int));
}
if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
{
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
if (g_ddraw->gdilinear)
{
SetStretchBltMode(g_ddraw->render.hdc, HALFTONE);

View File

@ -659,7 +659,7 @@ static void ogl_render()
if (glGetError() != GL_NO_ERROR)
g_ogl.use_opengl = FALSE;
}
else if (g_ddraw->wine)
else if (g_ddraw->wine || InterlockedExchange(&g_ddraw->render.clear_screen, FALSE))
{
glClear(GL_COLOR_BUFFER_BIT);
}

View File

@ -27,8 +27,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
lParam);
*/
RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height };
static BOOL in_size_move = FALSE;
static int redraw_count = 0;
@ -749,10 +747,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
}
case WM_ERASEBKGND:
{
EnterCriticalSection(&g_ddraw->cs);
FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH));
ReleaseSemaphore(g_ddraw->render.sem, 1, NULL);
LeaveCriticalSection(&g_ddraw->cs);
if (g_ddraw->maintas || g_ddraw->boxing)
{
InterlockedExchange(&g_ddraw->render.clear_screen, TRUE);
}
break;
}
}