From 025459ccb43b0a5a23cbb4453c9a0a1139b0bb2d Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 18 Mar 2006 23:42:03 +0000 Subject: Auto adjust settings when running fullscreen so that we run in a valid video mode. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 427 --- src/i_video.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/i_video.c b/src/i_video.c index e3c879cc..169efb5b 100644 --- a/src/i_video.c +++ b/src/i_video.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: i_video.c 415 2006-03-10 01:49:25Z fraggle $ +// $Id: i_video.c 427 2006-03-18 23:42:03Z fraggle $ // // Copyright(C) 1993-1996 Id Software, Inc. // Copyright(C) 2005 Simon Howard @@ -175,7 +175,7 @@ //----------------------------------------------------------------------------- static const char -rcsid[] = "$Id: i_video.c 415 2006-03-10 01:49:25Z fraggle $"; +rcsid[] = "$Id: i_video.c 427 2006-03-18 23:42:03Z fraggle $"; #include #include @@ -880,6 +880,40 @@ void I_SetWindowIcon(void) SDL_FreeSurface(surface); } +// Check if a screen mode is in the list available +// Not all machines support running in 320x200/640x400 (only support 4:3) +// Some don't even support modes below 640x480. + +static boolean CheckValidFSMode(int w, int h) +{ + SDL_Rect **modes; + int i; + + modes = SDL_ListModes(NULL, SDL_FULLSCREEN); + + for (i=0; modes[i]; ++i) + { + if (w == modes[i]->w && h == modes[i]->h) + return true; + } + + // not found + + return false; +} + +// Get window dimensions for the current settings + +static void GetWindowDimensions(int *windowwidth, int *windowheight) +{ + *windowwidth = SCREENWIDTH * screenmultiply; + + if (fullscreen == FULLSCREEN_LETTERBOX) + *windowheight = LETTERBOX_SCREENHEIGHT * screenmultiply; + else + *windowheight = SCREENHEIGHT * screenmultiply; +} + void I_InitGraphics(void) { SDL_Event dummy; @@ -933,12 +967,44 @@ void I_InitGraphics(void) if (screenmultiply > 2) screenmultiply = 2; - windowwidth = SCREENWIDTH * screenmultiply; + GetWindowDimensions(&windowwidth, &windowheight); - if (fullscreen == FULLSCREEN_LETTERBOX) - windowheight = LETTERBOX_SCREENHEIGHT * screenmultiply; - else - windowheight = SCREENHEIGHT * screenmultiply; + if (fullscreen) + { + if (!CheckValidFSMode(windowwidth, windowheight) && screenmultiply == 1) + { + // This is not a valid video mode. Try doubling up the screen + // if we are running at 320x200. + + printf("I_InitGraphics: Invalid mode %ix%i: turning on " + "scale x2 mode (screenmultiply=2)\n", + windowwidth, windowheight); + + screenmultiply = 2; + + GetWindowDimensions(&windowwidth, &windowheight); + } + + if (!CheckValidFSMode(windowwidth, windowheight) && fullscreen == 1) + { + // This is not a valid mode. Try turning on letterbox mode + // (640x400 -> 640x480) + + printf("I_InitGraphics: Invalid mode %ix%i: turning on " + "letterbox mode (fullscreen=2)\n", + windowwidth, windowheight); + + fullscreen = 2; + + GetWindowDimensions(&windowwidth, &windowheight); + } + + if (!CheckValidFSMode(windowwidth, windowheight)) + { + printf("I_InitGraphics: WARNING: Unable to find a valid " + "fullscreen video mode to run in.\n"); + } + } screen = SDL_SetVideoMode(windowwidth, windowheight, 8, flags); -- cgit v1.2.3