From ef60fb2e593ef30a6776cf1859dbd4ebfb14e81c Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 8 Jan 2026 11:45:53 +0200 Subject: [PATCH] [GDITOOLS] Improve ChangeScreenBpp utility function --- modules/rostests/apitests/gditools/gditools.c | 30 ++++++++++++++++--- modules/rostests/apitests/gditools/gditools.h | 2 +- .../apitests/win32u/ntgdi/NtGdiBitBlt.c | 6 ++-- .../apitests/win32u/ntgdi/NtGdiLineTo.c | 10 +++---- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/modules/rostests/apitests/gditools/gditools.c b/modules/rostests/apitests/gditools/gditools.c index 8292ef81dd4..6fa13983f94 100644 --- a/modules/rostests/apitests/gditools/gditools.c +++ b/modules/rostests/apitests/gditools/gditools.c @@ -106,10 +106,24 @@ GdiGetHandleUserData( return pentry->pUser; } +VOID +PrintAvailableDisplayModes(void) +{ + DEVMODEW dm = { .dmSize = sizeof(dm) }; + ULONG iMode = 0; + + printf("Available display modes:\n"); + while (EnumDisplaySettingsW(NULL, iMode++, &dm)) + { + printf(" %ux%u @ %u bpp, freq: %u Hz\n", + dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel, dm.dmDisplayFrequency); + } +} + BOOL ChangeScreenBpp( _In_ ULONG cBitsPixel, - _Out_ PULONG pcOldBitsPixel) + _Out_ PDEVMODEW pdmOld) { DEVMODEW dm = { .dmSize = sizeof(dm) }; @@ -119,18 +133,26 @@ ChangeScreenBpp( return FALSE; } - *pcOldBitsPixel = dm.dmBitsPerPel; + printf("ChangeScreenBpp(%lu): Old display settings: %ux%u @ %u bpp\n", + cBitsPixel, dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel); + + *pdmOld = dm; if (dm.dmBitsPerPel != cBitsPixel) { dm.dmBitsPerPel = cBitsPixel; - if (ChangeDisplaySettingsExW(NULL, &dm, NULL, CDS_UPDATEREGISTRY | CDS_GLOBAL, NULL) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettingsW(&dm, 0) != DISP_CHANGE_SUCCESSFUL) { - printf("Failed to change display settings to %lu bpp. Current bpp: %u\n", cBitsPixel, *pcOldBitsPixel); + printf("Failed to change display settings.\n"); + PrintAvailableDisplayModes(); return FALSE; } } + EnumDisplaySettingsW(NULL, ENUM_CURRENT_SETTINGS, &dm); + printf("ChangeScreenBpp(%lu): New display settings: %ux%u @ %u bpp\n", + cBitsPixel, dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel); + return TRUE; } diff --git a/modules/rostests/apitests/gditools/gditools.h b/modules/rostests/apitests/gditools/gditools.h index b48241816c4..547396bd8c0 100644 --- a/modules/rostests/apitests/gditools/gditools.h +++ b/modules/rostests/apitests/gditools/gditools.h @@ -44,4 +44,4 @@ GdiGetHandleUserData( BOOL ChangeScreenBpp( _In_ ULONG cBitsPixel, - _Out_ PULONG pcOldBitsPixel); + _Out_ PDEVMODEW pdmOld); diff --git a/modules/rostests/apitests/win32u/ntgdi/NtGdiBitBlt.c b/modules/rostests/apitests/win32u/ntgdi/NtGdiBitBlt.c index 91947602a7e..59437a3a559 100644 --- a/modules/rostests/apitests/win32u/ntgdi/NtGdiBitBlt.c +++ b/modules/rostests/apitests/win32u/ntgdi/NtGdiBitBlt.c @@ -355,8 +355,8 @@ START_TEST(NtGdiBitBlt) { ok(GdiToolsInit(), "GdiToolsInit failed\n"); - ULONG cBitsPixel; - ChangeScreenBpp(32, &cBitsPixel); + DEVMODEW dmOld; + ChangeScreenBpp(32, &dmOld); ghdcDDB1 = CreateCompatibleDC(NULL); SelectObject(ghdcDDB1, ghbmp1); @@ -371,5 +371,5 @@ START_TEST(NtGdiBitBlt) gbUseCLR_INVALID = FALSE; Test_NtGdiBitBlt_1BPP(); - ChangeScreenBpp(cBitsPixel, &cBitsPixel); + ChangeDisplaySettingsW(&dmOld, 0); } diff --git a/modules/rostests/apitests/win32u/ntgdi/NtGdiLineTo.c b/modules/rostests/apitests/win32u/ntgdi/NtGdiLineTo.c index e916a7f30c8..fbd353466e1 100644 --- a/modules/rostests/apitests/win32u/ntgdi/NtGdiLineTo.c +++ b/modules/rostests/apitests/win32u/ntgdi/NtGdiLineTo.c @@ -10,7 +10,7 @@ #define DIBINDEX(n) MAKELONG((n),0x10FF) -static HDC ghdcDDB1, ghdcDDB32; +static HDC ghdcDDB1; static COLORREF @@ -186,18 +186,16 @@ START_TEST(NtGdiLineTo) { ok(GdiToolsInit(), "GdiToolsInit failed\n"); - ULONG cBitsPixel; - ChangeScreenBpp(32, &cBitsPixel); + DEVMODEW dmOld; + ChangeScreenBpp(32, &dmOld); ghdcDDB1 = CreateCompatibleDC(NULL); ok(SelectObject(ghdcDDB1, ghbmp1) != NULL, "SelectObject failed\n"); - ghdcDDB32 = CreateCompatibleDC(NULL); - ok(SelectObject(ghdcDDB32, ghbmp32) != NULL, "SelectObject failed\n"); Test_NtGdiLineTo_1BPP_BW(ghdcDDB1); Test_NtGdiLineTo_1BPP_BW(ghdcDIB1); Test_NtGdiLineTo_1BPP_BW(ghdcDIB1_InvCol); Test_NtGdiLineTo_1BPP_RB(); - ChangeScreenBpp(cBitsPixel, &cBitsPixel); + ChangeDisplaySettingsW(&dmOld, 0); }