From b3f9e7d04562bfb754ad79173419ee3ac50af3c6 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Thu, 5 Aug 2021 00:26:29 +0200
Subject: [PATCH] #111 clear screen on resolution change and window resize

---
 inc/dd.h          |  1 +
 src/dd.c          |  5 +++++
 src/render_d3d9.c |  5 +++++
 src/render_gdi.c  |  6 ++++++
 src/render_ogl.c  |  2 +-
 src/wndproc.c     | 10 ++++------
 6 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/inc/dd.h b/inc/dd.h
index 1c2dfb8..4b78f43 100644
--- a/inc/dd.h
+++ b/inc/dd.h
@@ -83,6 +83,7 @@ typedef struct CNCDDRAW
 
         LONG palette_updated;
         LONG surface_updated;
+        LONG clear_screen;
 
         float scale_w;
         float scale_h;
diff --git a/src/dd.c b/src/dd.c
index bf64109..7394178 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -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);
diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index 85419ea..05c0290 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -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);
 
diff --git a/src/render_gdi.c b/src/render_gdi.c
index d036c2d..c216ccc 100644
--- a/src/render_gdi.c
+++ b/src/render_gdi.c
@@ -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);
diff --git a/src/render_ogl.c b/src/render_ogl.c
index a312f08..b13f153 100644
--- a/src/render_ogl.c
+++ b/src/render_ogl.c
@@ -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);
             }
diff --git a/src/wndproc.c b/src/wndproc.c
index 784ea6f..f76e913 100644
--- a/src/wndproc.c
+++ b/src/wndproc.c
@@ -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;
     }
     }