Try to get maximum display width by assuming that would match maximum

possible resolution for fullscreen+hwsurface. Fix, termination of VModes[].
Really handle "windowmodes" prefs item, but this needs code factoring.
This commit is contained in:
gbeauche 2004-06-24 21:46:55 +00:00
parent df3cf1ac52
commit 3706fbc70d

View File

@ -342,15 +342,58 @@ static int sdl_depth_of_video_depth(int video_depth)
return depth; return depth;
} }
// Check wether specified mode is available
static bool has_mode(int type, int width, int height)
{
// FIXME: no fullscreen support yet
if (type == DISPLAY_SCREEN)
return false;
#ifdef SHEEPSHAVER
// Filter out Classic resolutiosn
if (width == 512 && height == 384)
return false;
// Read window modes prefs
static uint32 window_modes = 0;
static uint32 screen_modes = 0;
if (window_modes == 0 || screen_modes == 0) {
window_modes = PrefsFindInt32("windowmodes");
screen_modes = PrefsFindInt32("screenmodes");
if (window_modes == 0 || screen_modes == 0)
window_modes |= 3; // Allow at least 640x480 and 800x600 window modes
}
if (type == DISPLAY_WINDOW) {
int apple_mask, apple_id = find_apple_resolution(width, height);
switch (apple_id) {
case APPLE_640x480: apple_mask = 0x01; break;
case APPLE_800x600: apple_mask = 0x02; break;
case APPLE_1024x768: apple_mask = 0x04; break;
case APPLE_1152x768: apple_mask = 0x40; break;
case APPLE_1152x900: apple_mask = 0x08; break;
case APPLE_1280x1024: apple_mask = 0x10; break;
case APPLE_1600x1200: apple_mask = 0x20; break;
default: apple_mask = 0x00; break;
}
return (window_modes & apple_mask);
}
#else
return true;
#endif
return false;
}
// Add mode to list of supported modes // Add mode to list of supported modes
static void add_mode(int type, int width, int height, int resolution_id, int bytes_per_row, int depth) static void add_mode(int type, int width, int height, int resolution_id, int bytes_per_row, int depth)
{ {
VIDEO_MODE mode; // Filter out unsupported modes
#ifdef SHEEPSHAVER if (!has_mode(type, width, height))
// Don't add 512x384 modes
if (width == 512 && height == 384)
return; return;
// Fill in VideoMode entry
VIDEO_MODE mode;
#ifdef SHEEPSHAVER
// Recalculate dimensions to fit Apple modes // Recalculate dimensions to fit Apple modes
resolution_id = match_apple_resolution(width, height); resolution_id = match_apple_resolution(width, height);
mode.viType = type; mode.viType = type;
@ -748,6 +791,10 @@ bool SDL_monitor_desc::video_open(void)
{ {
D(bug("video_open()\n")); D(bug("video_open()\n"));
const VIDEO_MODE &mode = get_current_mode(); const VIDEO_MODE &mode = get_current_mode();
#if DEBUG
D(bug("Current video mode:\n"));
D(bug(" %dx%d (ID %02x), %d bpp\n", VIDEO_MODE_X, VIDEO_MODE_Y, VIDEO_MODE_RESOLUTION, 1 << (VIDEO_MODE_DEPTH & 0x0f)));
#endif
// Create display driver object of requested type // Create display driver object of requested type
switch (display_type) { switch (display_type) {
@ -820,11 +867,13 @@ bool VideoInit(bool classic)
mouse_wheel_lines = PrefsFindInt32("mousewheellines"); mouse_wheel_lines = PrefsFindInt32("mousewheellines");
// Get screen mode from preferences // Get screen mode from preferences
const char *mode_str; const char *mode_str = NULL;
#ifndef SHEEPSHAVER
if (classic_mode) if (classic_mode)
mode_str = "win/512/342"; mode_str = "win/512/342";
else else
mode_str = PrefsFindString("screen"); mode_str = PrefsFindString("screen");
#endif
// Determine display type and default dimensions // Determine display type and default dimensions
int default_width, default_height; int default_width, default_height;
@ -842,12 +891,14 @@ bool VideoInit(bool classic)
display_type = DISPLAY_WINDOW; display_type = DISPLAY_WINDOW;
} }
int max_width = 640, max_height = 480; int max_width = 640, max_height = 480;
if (display_type == DISPLAY_SCREEN) {
SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE); SDL_Rect **modes = SDL_ListModes(NULL, SDL_FULLSCREEN | SDL_HWSURFACE);
if (modes && modes != (SDL_Rect **)-1) { if (modes && modes != (SDL_Rect **)-1) {
max_width = modes[0]->w; max_width = modes[0]->w;
max_height = modes[0]->h; max_height = modes[0]->h;
} if (default_width > max_width)
default_width = max_width;
if (default_height > max_height)
default_height = max_height;
} }
if (default_width <= 0) if (default_width <= 0)
default_width = max_width; default_width = max_width;
@ -914,12 +965,14 @@ bool VideoInit(bool classic)
} }
#ifdef SHEEPSHAVER #ifdef SHEEPSHAVER
for (int i = 0; i < VideoModes.size(); ++i) for (int i = 0; i < VideoModes.size(); i++)
VModes[i] = VideoModes[i]; VModes[i] = VideoModes[i];
VideoInfo *p = &VModes[VideoModes.size()];
const VIDEO_MODE & mode = VideoModes[cur_mode]; p->viType = DIS_INVALID; // End marker
D(bug("Current video mode\n")); p->viRowBytes = 0;
D(bug(" %dx%d (ID %02x), %d bpp\n", VIDEO_MODE_X, VIDEO_MODE_Y, VIDEO_MODE_RESOLUTION, 1 << (VIDEO_MODE_DEPTH - 0x80))); p->viXsize = p->viYsize = 0;
p->viAppleMode = 0;
p->viAppleID = 0;
#endif #endif
#if DEBUG #if DEBUG