From 9498ac52b914569aa356a196b9ca1be63eba28ed Mon Sep 17 00:00:00 2001 From: Camilla Berglund Date: Fri, 6 Jul 2012 22:52:53 +0200 Subject: [PATCH] Simplified Win32 video mode enumeration. --- src/win32_fullscreen.c | 66 +++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/src/win32_fullscreen.c b/src/win32_fullscreen.c index cf76ead2..d33b4eaa 100644 --- a/src/win32_fullscreen.c +++ b/src/win32_fullscreen.c @@ -184,64 +184,50 @@ void _glfwRestoreVideoMode(void) int _glfwPlatformGetVideoModes(_GLFWmonitor* monitor, GLFWvidmode* list, int maxcount) { - DEVMODE deviceMode; - DWORD deviceModeNum; + DWORD deviceModeIndex = 0; + int modeCount = 0; - GLFWvidmode* vidModes; - int vidModesCount; - GLFWvidmode vidMode; - - deviceMode.dmSize = sizeof(DEVMODE); - deviceModeNum = 0; - - vidModes = NULL; - vidModesCount = 0; + WCHAR* deviceName = _glfwCreateWideStringFromUTF8(monitor->Win32.name); + if (!deviceName) + return 0; for (;;) { - BOOL result; - WCHAR* wideName = _glfwCreateWideStringFromUTF8(monitor->Win32.name); - if (!wideName) - break; + GLFWvidmode mode; + DEVMODE deviceMode; - result = EnumDisplaySettings(wideName, deviceModeNum, &deviceMode); - free(wideName); + ZeroMemory(&deviceMode, sizeof(DEVMODE)); + deviceMode.dmSize = sizeof(DEVMODE); - if (!result) + if (!EnumDisplaySettings(deviceName, deviceModeIndex, &deviceMode)) break; - if (vidModesCount >= maxcount) - break; - - deviceModeNum++; - + deviceModeIndex++; if (deviceMode.dmBitsPerPel < 15) continue; - vidMode.height = deviceMode.dmPelsHeight; - vidMode.width = deviceMode.dmPelsWidth; - // Convert to RGB, and back to bpp ("mask out" alpha bits etc) + mode.height = deviceMode.dmPelsHeight; + mode.width = deviceMode.dmPelsWidth; _glfwSplitBPP(deviceMode.dmBitsPerPel, - &vidMode.redBits, - &vidMode.greenBits, - &vidMode.blueBits); + &mode.redBits, + &mode.greenBits, + &mode.blueBits); - // skip duplicates. - if (vidModes && bsearch(&vidMode, vidModes, vidModesCount, sizeof(GLFWvidmode), _glfwCompareVideoModes)) + // Skip duplicate modes + if (bsearch(&mode, list, modeCount, sizeof(GLFWvidmode), _glfwCompareVideoModes)) continue; - vidModes = realloc(vidModes, sizeof(GLFWvidmode) * ++vidModesCount); - memcpy(vidModes + (vidModesCount - 1), &vidMode, sizeof(GLFWvidmode)); + list[modeCount] = mode; + modeCount++; - qsort(vidModes, vidModesCount, sizeof(GLFWvidmode), _glfwCompareVideoModes); + qsort(list, modeCount, sizeof(GLFWvidmode), _glfwCompareVideoModes); + + if (modeCount >= maxcount) + break; } - if (list && maxcount) - memcpy(list, vidModes, sizeof(GLFWvidmode) * ((vidModesCount < maxcount) ? vidModesCount : maxcount)); - - free(vidModes); - - return vidModesCount; + free(deviceName); + return modeCount; }