1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-16 06:18:53 +01:00

some tweaks for upscaling checks

This commit is contained in:
FunkyFr3sh 2021-10-31 21:19:16 +01:00
parent 49b5f808e6
commit 11c0353b82

115
src/dd.c

@ -491,100 +491,77 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl
if (!g_ddraw->windowed) if (!g_ddraw->windowed)
{ {
/* Making sure the chosen resolution is valid */ /* 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) if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
{ {
/* fail... compare resolutions */ /* Try without upscaling */
if (g_ddraw->render.width > g_ddraw->mode.dmPelsWidth || g_ddraw->render.width = g_ddraw->width;
g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) 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 */ /* Try 2x scaling */
g_ddraw->render.width = g_ddraw->width; g_ddraw->render.width *= 2;
g_ddraw->render.height = g_ddraw->height; g_ddraw->render.height *= 2;
g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; 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 */ SIZE res = { 0 };
g_ddraw->windowed = TRUE;
}
}
else
{
/* 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; /* try to get a resolution with the same aspect ratio as the requested resolution */
g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; 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) if (!found_res)
{ {
/* Try 2x scaling */ /* try to get a resolution with the same aspect ratio as the current display mode */
g_ddraw->render.width *= 2; found_res = util_get_lowest_resolution(
g_ddraw->render.height *= 2; (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.dmPelsWidth = g_ddraw->render.width;
g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth || if (!found_res ||
g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) ||
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
{ {
SIZE res = { 0 }; /* try current display settings */
g_ddraw->render.width = g_ddraw->mode.dmPelsWidth;
/* try to get a resolution with the same aspect ratio as the requested resolution */ g_ddraw->render.height = g_ddraw->mode.dmPelsHeight;
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;
g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
if (!found_res || if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL)
{ {
/* try current display settings */ /* everything failed, use windowed mode instead */
g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; g_ddraw->render.width = g_ddraw->width;
g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; g_ddraw->render.height = g_ddraw->height;
g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width;
g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height;
if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) g_ddraw->windowed = TRUE;
{
/* 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;
}
} }
} }
} }