//======================================================================== // Video mode test // Copyright (c) Camilla Berglund // // This software is provided 'as-is', without any express or implied // warranty. In no event will the authors be held liable for any damages // arising from the use of this software. // // Permission is granted to anyone to use this software for any purpose, // including commercial applications, and to alter it and redistribute it // freely, subject to the following restrictions: // // 1. The origin of this software must not be misrepresented; you must not // claim that you wrote the original software. If you use this software // in a product, an acknowledgment in the product documentation would // be appreciated but is not required. // // 2. Altered source versions must be plainly marked as such, and must not // be misrepresented as being the original software. // // 3. This notice may not be removed or altered from any source // distribution. // //======================================================================== // // This test enumerates or verifies video modes // //======================================================================== #include #include #include #include "getopt.h" static GLFWwindow window = NULL; enum Mode { NO_MODE, LIST_MODE, TEST_MODE }; static void usage(void) { printf("Usage: modes -l\n"); printf(" modes -t\n"); printf(" modes -h\n"); } static void print_mode(GLFWvidmode* mode) { printf("%i x %i x %i (%i %i %i)", mode->width, mode->height, mode->redBits + mode->greenBits + mode->blueBits, mode->redBits, mode->greenBits, mode->blueBits); } static void error_callback(int error, const char* description) { fprintf(stderr, "Error: %s\n", description); } static void window_size_callback(GLFWwindow window, int width, int height) { printf("Window resized to %ix%i\n", width, height); glViewport(0, 0, width, height); } static int window_close_callback(GLFWwindow dummy) { window = NULL; return GL_TRUE; } static void list_modes(GLFWvidmode* modes, int count) { int i; GLFWvidmode mode; glfwGetDesktopMode(&mode); printf("Desktop mode: "); print_mode(&mode); putchar('\n'); for (i = 0; i < count; i++) { printf("%3i: ", i); print_mode(modes + i); putchar('\n'); } } static void test_modes(GLFWvidmode* modes, int count) { int i, width, height; glfwSetWindowSizeCallback(window_size_callback); glfwSetWindowCloseCallback(window_close_callback); for (i = 0; i < count; i++) { glfwOpenWindowHint(GLFW_RED_BITS, modes[i].redBits); glfwOpenWindowHint(GLFW_GREEN_BITS, modes[i].greenBits); glfwOpenWindowHint(GLFW_BLUE_BITS, modes[i].blueBits); printf("Opening "); print_mode(modes + i); printf(" window\n"); window = glfwOpenWindow(modes[i].width, modes[i].height, GLFW_FULLSCREEN, "Video Mode Test", NULL); if (!window) { printf("Failed to enter mode %i: ", i); print_mode(modes + i); putchar('\n'); continue; } glfwSetTime(0.0); glfwSwapInterval(1); while (glfwGetTime() < 5.0) { glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(); glfwPollEvents(); if (!window) { printf("User terminated program\n"); exit(EXIT_SUCCESS); } } if (glfwGetWindowParam(window, GLFW_RED_BITS) != modes[i].redBits || glfwGetWindowParam(window, GLFW_GREEN_BITS) != modes[i].greenBits || glfwGetWindowParam(window, GLFW_BLUE_BITS) != modes[i].blueBits) { printf("*** Color bit mismatch: (%i %i %i) instead of (%i %i %i)\n", glfwGetWindowParam(window, GLFW_RED_BITS), glfwGetWindowParam(window, GLFW_GREEN_BITS), glfwGetWindowParam(window, GLFW_BLUE_BITS), modes[i].redBits, modes[i].greenBits, modes[i].blueBits); } glfwGetWindowSize(window, &width, &height); if (width != modes[i].width || height != modes[i].height) { printf("*** Size mismatch: %ix%i instead of %ix%i\n", width, height, modes[i].width, modes[i].height); } printf("Closing window\n"); glfwCloseWindow(window); glfwPollEvents(); window = NULL; } } int main(int argc, char** argv) { int ch, found, count = 0, mode = NO_MODE; GLFWvidmode* modes = NULL; while ((ch = getopt(argc, argv, "lth")) != -1) { switch (ch) { case 'h': usage(); exit(EXIT_SUCCESS); case 'l': mode = LIST_MODE; break; case 't': mode = TEST_MODE; break; default: usage(); exit(EXIT_FAILURE); } } argc -= optind; argv += optind; glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); for (;;) { count += 256; modes = realloc(modes, sizeof(GLFWvidmode) * count); found = glfwGetVideoModes(modes, count); if (found < count) break; } if (mode == LIST_MODE) list_modes(modes, found); else if (mode == TEST_MODE) test_modes(modes, found); free(modes); modes = NULL; exit(EXIT_SUCCESS); }