From 11c0353b8299438770bd6e950bf7f9ea7febb2da Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Sun, 31 Oct 2021 21:19:16 +0100
Subject: [PATCH] some tweaks for upscaling checks

---
 src/dd.c | 115 ++++++++++++++++++++++---------------------------------
 1 file changed, 46 insertions(+), 69 deletions(-)

diff --git a/src/dd.c b/src/dd.c
index a7d7149..73773f3 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -491,100 +491,77 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
     if (!g_ddraw->windowed)
     {
         /* Making sure the chosen resolution is valid */
-        int old_width = g_ddraw->render.width;
-        int old_height = g_ddraw->render.height;
-
         if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
         {
-            /* fail... compare resolutions */
-            if (g_ddraw->render.width > g_ddraw->mode.dmPelsWidth ||
-                g_ddraw->render.height > g_ddraw->mode.dmPelsHeight)
+            /* Try without upscaling */
+            g_ddraw->render.width = g_ddraw->width;
+            g_ddraw->render.height = g_ddraw->height;
+
+            g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
+            g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
+
+            if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
             {
-                /* Try without upscaling */
-                g_ddraw->render.width = g_ddraw->width;
-                g_ddraw->render.height = g_ddraw->height;
+                /* Try 2x scaling */
+                g_ddraw->render.width *= 2;
+                g_ddraw->render.height *= 2;
 
                 g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
                 g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
 
-                if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
+                if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth ||
+                    g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) ||
+                    ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
                 {
-                    /* chosen game resolution higher than current resolution, use windowed mode for this case */
-                    g_ddraw->windowed = TRUE;
-                }
-            }
-            else
-            {
-                /* Try without upscaling */
-                g_ddraw->render.width = g_ddraw->width;
-                g_ddraw->render.height = g_ddraw->height;
+                    SIZE res = { 0 };
 
-                g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
-                g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
+                    /* try to get a resolution with the same aspect ratio as the requested resolution */
+                    BOOL found_res = util_get_lowest_resolution(
+                        (float)g_ddraw->width / g_ddraw->height,
+                        &res,
+                        g_ddraw->width + 1, /* don't return the original resolution since we tested that one already */
+                        g_ddraw->height + 1,
+                        g_ddraw->mode.dmPelsWidth,
+                        g_ddraw->mode.dmPelsHeight);
 
-                if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
-                {
-                    /* Try 2x scaling */
-                    g_ddraw->render.width *= 2;
-                    g_ddraw->render.height *= 2;
+                    if (!found_res)
+                    {
+                        /* try to get a resolution with the same aspect ratio as the current display mode */
+                        found_res = util_get_lowest_resolution(
+                            (float)g_ddraw->mode.dmPelsWidth / g_ddraw->mode.dmPelsHeight,
+                            &res,
+                            g_ddraw->width,
+                            g_ddraw->height,
+                            g_ddraw->mode.dmPelsWidth,
+                            g_ddraw->mode.dmPelsHeight);
+                    }
+
+                    g_ddraw->render.width = res.cx;
+                    g_ddraw->render.height = res.cy;
 
                     g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
                     g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
 
-                    if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth ||
-                        g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) ||
+                    if (!found_res ||
                         ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
                     {
-                        SIZE res = { 0 };
-
-                        /* try to get a resolution with the same aspect ratio as the requested resolution */
-                        BOOL found_res = util_get_lowest_resolution(
-                            (float)old_width / old_height,
-                            &res,
-                            old_width + 1, /* don't return the original resolution since we tested that one already */
-                            old_height + 1,
-                            g_ddraw->mode.dmPelsWidth,
-                            g_ddraw->mode.dmPelsHeight);
-
-                        if (!found_res)
-                        {
-                            /* try to get a resolution with the same aspect ratio as the current display mode */
-                            found_res = util_get_lowest_resolution(
-                                (float)g_ddraw->mode.dmPelsWidth / g_ddraw->mode.dmPelsHeight,
-                                &res,
-                                old_width,
-                                old_height,
-                                g_ddraw->mode.dmPelsWidth,
-                                g_ddraw->mode.dmPelsHeight);
-                        }
-
-                        g_ddraw->render.width = res.cx;
-                        g_ddraw->render.height = res.cy;
+                        /* try current display settings */
+                        g_ddraw->render.width = g_ddraw->mode.dmPelsWidth;
+                        g_ddraw->render.height = g_ddraw->mode.dmPelsHeight;
 
                         g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
                         g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
 
-                        if (!found_res || 
-                            ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
+                        if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
                         {
-                            /* try current display settings */
-                            g_ddraw->render.width = g_ddraw->mode.dmPelsWidth;
-                            g_ddraw->render.height = g_ddraw->mode.dmPelsHeight;
+                            /* everything failed, use windowed mode instead */
+                            g_ddraw->render.width = g_ddraw->width;
+                            g_ddraw->render.height = g_ddraw->height;
 
                             g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
                             g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
 
-                            if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
-                            {
-                                /* everything failed, use windowed mode instead */
-                                g_ddraw->render.width = old_width;
-                                g_ddraw->render.height = old_height;
-
-                                g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
-                                g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
-
-                                g_ddraw->windowed = TRUE;
-                            }
+                            g_ddraw->windowed = TRUE;
                         }
                     }
                 }