|
|
1.1 ! root 1: /* ! 2: Hatari - resolution.c ! 3: ! 4: This file is distributed under the GNU Public License, version 2 or at ! 5: your option any later version. Read the file gpl.txt for details. ! 6: ! 7: SDL resolution limitation and selection routines. ! 8: */ ! 9: const char Resolution_fileid[] = "Hatari resolution.c : " __DATE__ " " __TIME__; ! 10: ! 11: #include <SDL.h> ! 12: #include "main.h" ! 13: #include "configuration.h" ! 14: #include "resolution.h" ! 15: #include "screen.h" ! 16: ! 17: #define RESOLUTION_DEBUG 0 ! 18: ! 19: #if RESOLUTION_DEBUG ! 20: #define Dprintf(a) printf a ! 21: #else ! 22: #define Dprintf(a) ! 23: #endif ! 24: ! 25: ! 26: /** ! 27: * Select best resolution from given SDL video modes. ! 28: * - If width and height are given, select the smallest mode larger ! 29: * or equal to requested size ! 30: * - Otherwise select the largest available mode ! 31: * return true for success and false if no matching mode was found. ! 32: */ ! 33: static bool Resolution_Select(SDL_Rect **modes, int *width, int *height) ! 34: { ! 35: #define TOO_LARGE 0x7fff ! 36: int i, bestw, besth; ! 37: ! 38: if (!(*width && *height)) { ! 39: /* search the largest mode (prefer wider ones) */ ! 40: for (i = 0; modes[i]; i++) { ! 41: if ((modes[i]->w > *width) && (modes[i]->h >= *height)) { ! 42: *width = modes[i]->w; ! 43: *height = modes[i]->h; ! 44: } ! 45: } ! 46: Dprintf(("hostscreen: largest found video mode: %dx%d\n",*width,*height)); ! 47: return true; ! 48: } ! 49: ! 50: /* Search the smallest mode larger or equal to requested size */ ! 51: bestw = TOO_LARGE; ! 52: besth = TOO_LARGE; ! 53: for (i = 0; modes[i]; i++) { ! 54: if ((modes[i]->w >= *width) && (modes[i]->h >= *height)) { ! 55: if ((modes[i]->w < bestw) || (modes[i]->h < besth)) { ! 56: bestw = modes[i]->w; ! 57: besth = modes[i]->h; ! 58: } ! 59: } ! 60: } ! 61: if (bestw == TOO_LARGE || besth == TOO_LARGE) { ! 62: return false; ! 63: } ! 64: *width = bestw; ! 65: *height = besth; ! 66: Dprintf(("hostscreen: video mode found: %dx%d\n",*width,*height)); ! 67: return true; ! 68: #undef TOO_LARGE ! 69: } ! 70: ! 71: ! 72: /** ! 73: * Search video mode size that best suits the given width/height/bpp ! 74: * constraints and set them into given arguments. With zeroed arguments, ! 75: * return largest video mode. ! 76: */ ! 77: void Resolution_Search(int *width, int *height, int *bpp) ! 78: { ! 79: SDL_Rect **modes; ! 80: SDL_PixelFormat pixelformat; ! 81: Uint32 modeflags; ! 82: ! 83: /* Search in available modes the best suited */ ! 84: Dprintf(("hostscreen: video mode asked: %dx%dx%d\n", ! 85: *width, *height, *bpp)); ! 86: ! 87: /* Read available video modes */ ! 88: modeflags = 0 /*SDL_HWSURFACE | SDL_HWPALETTE*/; ! 89: if (bInFullScreen) ! 90: modeflags |= SDL_FULLSCREEN; ! 91: ! 92: /*--- Search a video mode with asked bpp ---*/ ! 93: if (*bpp != 0) { ! 94: pixelformat.BitsPerPixel = *bpp; ! 95: modes = SDL_ListModes(&pixelformat, modeflags); ! 96: if ((modes != (SDL_Rect **) 0) && (modes != (SDL_Rect **) -1)) { ! 97: Dprintf(("hostscreen: searching a good video mode (any bpp)\n")); ! 98: if (Resolution_Select(modes, width, height)) { ! 99: Dprintf(("hostscreen: video mode selected: %dx%dx%d\n", ! 100: *width, *height, *bpp)); ! 101: return; ! 102: } ! 103: } ! 104: } ! 105: ! 106: /*--- Search a video mode with any bpp ---*/ ! 107: modes = SDL_ListModes(NULL, modeflags); ! 108: if ((modes != (SDL_Rect **) 0) && (modes != (SDL_Rect **) -1)) { ! 109: Dprintf(("hostscreen: searching a good video mode\n")); ! 110: if (Resolution_Select(modes, width, height)) { ! 111: Dprintf(("hostscreen: video mode selected: %dx%dx%d\n", ! 112: *width, *height, *bpp)); ! 113: return; ! 114: } ! 115: } ! 116: ! 117: if (modes == (SDL_Rect **) 0) { ! 118: fprintf(stderr, "WARNING: No suitable video modes available!\n"); ! 119: } ! 120: ! 121: if (modes == (SDL_Rect **) -1) { ! 122: /* Any mode available */ ! 123: Dprintf(("hostscreen: All resolutions available.\n")); ! 124: } ! 125: ! 126: Dprintf(("hostscreen: video mode selected: %dx%dx%d\n", ! 127: *width, *height, *bpp)); ! 128: } ! 129: ! 130: ! 131: /** ! 132: * Set given width & height arguments to maximum size in the configuration, ! 133: * or if that's too large for the requested bit depth, to the largest ! 134: * available video mode size. ! 135: */ ! 136: void Resolution_GetLimits(int *width, int *height, int *bpp) ! 137: { ! 138: *width = *height = 0; ! 139: /* constrain max size to what HW/SDL offers */ ! 140: Resolution_Search(width, height, bpp); ! 141: if (!(*width && *width) || ! 142: (ConfigureParams.Screen.nMaxWidth < *width && ! 143: ConfigureParams.Screen.nMaxHeight < *height)) { ! 144: /* already within it, use user provided value */ ! 145: *width = ConfigureParams.Screen.nMaxWidth; ! 146: *height = ConfigureParams.Screen.nMaxHeight; ! 147: } ! 148: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.