diff options
author | Simon Howard | 2006-03-18 23:42:03 +0000 |
---|---|---|
committer | Simon Howard | 2006-03-18 23:42:03 +0000 |
commit | 025459ccb43b0a5a23cbb4453c9a0a1139b0bb2d (patch) | |
tree | a79e00276f54045d729806dc6995912284593903 /src | |
parent | 3d1cf028d866c9fabce4cfdcaadbe87bba29256a (diff) | |
download | chocolate-doom-025459ccb43b0a5a23cbb4453c9a0a1139b0bb2d.tar.gz chocolate-doom-025459ccb43b0a5a23cbb4453c9a0a1139b0bb2d.tar.bz2 chocolate-doom-025459ccb43b0a5a23cbb4453c9a0a1139b0bb2d.zip |
Auto adjust settings when running fullscreen so that we run in a
valid video mode.
Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 427
Diffstat (limited to 'src')
-rw-r--r-- | src/i_video.c | 80 |
1 files changed, 73 insertions, 7 deletions
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 <SDL.h> #include <ctype.h> @@ -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); |