/* =================== VID_Init =================== */ void VID_Init (void) { static char vid_center[] = "SDL_VIDEO_CENTERED=center"; const SDL_VideoInfo *info; int width, height, bpp; qboolean fullscreen; const char *read_vars[] = { "vid_fullscreen", "vid_width", "vid_height", "vid_bpp", "vid_vsync" }; #define num_readvars ( sizeof(read_vars)/sizeof(read_vars[0]) ) Cvar_RegisterVariable (&vid_fullscreen); //johnfitz Cvar_RegisterVariable (&vid_width); //johnfitz Cvar_RegisterVariable (&vid_height); //johnfitz Cvar_RegisterVariable (&vid_bpp); //johnfitz Cvar_RegisterVariable (&vid_vsync); //johnfitz Cvar_SetCallback (&vid_fullscreen, VID_Changed_f); Cvar_SetCallback (&vid_width, VID_Changed_f); Cvar_SetCallback (&vid_height, VID_Changed_f); Cvar_SetCallback (&vid_bpp, VID_Changed_f); Cvar_SetCallback (&vid_vsync, VID_Changed_f); Cmd_AddCommand ("vid_unlock", VID_Unlock); //johnfitz Cmd_AddCommand ("vid_restart", VID_Restart); //johnfitz Cmd_AddCommand ("vid_test", VID_Test); //johnfitz Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f); Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f); putenv (vid_center); /* SDL_putenv is problematic in versions <= 1.2.9 */ if (SDL_InitSubSystem(SDL_INIT_VIDEO) == -1) Sys_Error("Could not initialize SDL Video"); info = SDL_GetVideoInfo(); Cvar_SetValueQuick (&vid_bpp, (float)info->vfmt->BitsPerPixel); if (CFG_OpenConfig("config.cfg") == 0) { CFG_ReadCvars(read_vars, num_readvars); CFG_CloseConfig(); } CFG_ReadCvarOverrides(read_vars, num_readvars); VID_InitModelist(); width = (int)vid_width.value; height = (int)vid_height.value; bpp = (int)vid_bpp.value; fullscreen = (int)vid_fullscreen.value; if (COM_CheckParm("-current")) { width = info->current_w; height = info->current_h; bpp = info->vfmt->BitsPerPixel; fullscreen = true; } else { int p; p = COM_CheckParm("-width"); if (p && p < com_argc-1) { width = Q_atoi(com_argv[p+1]); if(!COM_CheckParm("-height")) height = width * 3 / 4; } p = COM_CheckParm("-height"); if (p && p < com_argc-1) { height = Q_atoi(com_argv[p+1]); if(!COM_CheckParm("-width")) width = height * 4 / 3; } p = COM_CheckParm("-bpp"); if (p && p < com_argc-1) bpp = Q_atoi(com_argv[p+1]); if (COM_CheckParm("-window") || COM_CheckParm("-w")) fullscreen = false; else if (COM_CheckParm("-fullscreen") || COM_CheckParm("-f")) fullscreen = true; } if (!VID_ValidMode(width, height, bpp, fullscreen)) { width = (int)vid_width.value; height = (int)vid_height.value; bpp = (int)vid_bpp.value; fullscreen = (int)vid_fullscreen.value; } if (!VID_ValidMode(width, height, bpp, fullscreen)) { width = 640; height = 480; bpp = info->vfmt->BitsPerPixel; fullscreen = false; } vid_initialized = true; vid.maxwarpwidth = WARP_WIDTH; vid.maxwarpheight = WARP_HEIGHT; vid.colormap = host_colormap; vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048)); // set window icon PL_SetWindowIcon(); VID_SetMode (width, height, bpp, fullscreen); GL_Init (); GL_SetupState (); Cmd_AddCommand ("gl_info", GL_Info_f); //johnfitz //johnfitz -- removed code creating "glquake" subdirectory vid_menucmdfn = VID_Menu_f; //johnfitz vid_menudrawfn = VID_MenuDraw; vid_menukeyfn = VID_MenuKey; VID_Gamma_Init(); //johnfitz VID_Menu_Init(); //johnfitz //QuakeSpasm: current vid settings should override config file settings. //so we have to lock the vid mode from now until after all config files are read. vid_locked = true; }
/* =================== VID_Init =================== */ void VID_Init (unsigned char *palette) { int width, height, i, temp; SDL_Rect **enumlist; const char *read_vars[] = { "vid_config_fscr", "vid_config_swx", "vid_config_swy" }; #define num_readvars ( sizeof(read_vars)/sizeof(read_vars[0]) ) temp = scr_disabled_for_loading; scr_disabled_for_loading = true; Cvar_RegisterVariable (&vid_config_fscr); Cvar_RegisterVariable (&vid_config_swy); Cvar_RegisterVariable (&vid_config_swx); Cvar_RegisterVariable (&vid_config_gly); Cvar_RegisterVariable (&vid_config_glx); Cvar_RegisterVariable (&vid_mode); Cvar_RegisterVariable (&_enable_mouse); Cvar_RegisterVariable (&vid_showload); Cmd_AddCommand ("vid_showinfo", VID_ShowInfo_f); Cmd_AddCommand ("vid_listmodes", VID_ListModes_f); Cmd_AddCommand ("vid_nummodes", VID_NumModes_f); Cmd_AddCommand ("vid_restart", VID_Restart_f); // init sdl // the first check is actually unnecessary if ( (SDL_WasInit(SDL_INIT_VIDEO)) == 0 ) { if (SDL_Init(SDL_INIT_VIDEO) < 0) Sys_Error("VID: Couldn't load SDL: %s", SDL_GetError()); } // this will contain the "best bpp" for the current display // make sure to re-retrieve it if you ever re-init sdl_video vid_info = SDL_GetVideoInfo(); // retrieve the list of fullscreen modes enumlist = SDL_ListModes(NULL, SDL_SWSURFACE|SDL_HWPALETTE|SDL_FULLSCREEN); // prepare the modelists, find the actual modenum for vid_default VID_PrepareModes(enumlist); // set vid_mode to our safe default first Cvar_SetValue ("vid_mode", vid_default); // perform an early read of config.cfg CFG_ReadCvars (read_vars, num_readvars); // windowed mode is default // see if the user wants fullscreen if (COM_CheckParm("-fullscreen") || COM_CheckParm("-f")) { Cvar_SetValue("vid_config_fscr", 1); } else if (COM_CheckParm("-window") || COM_CheckParm("-w")) { Cvar_SetValue("vid_config_fscr", 0); } if (vid_config_fscr.integer && !num_fmodes) // FIXME: see below, as well Sys_Error ("No fullscreen modes available at this color depth"); width = vid_config_swx.integer; height = vid_config_swy.integer; // user is always right ... i = COM_CheckParm("-width"); if (i && i < com_argc-1) { // FIXME: this part doesn't know about a disaster case // like we aren't reported any fullscreen modes. width = atoi(com_argv[i+1]); i = COM_CheckParm("-height"); if (i && i < com_argc-1) height = atoi(com_argv[i+1]); else // proceed with 4/3 ratio height = 3 * width / 4; } // user requested a mode either from the config or from the // command line // scan existing modes to see if this is already available // if not, add this as the last "valid" video mode and set // vid_mode to it only if it doesn't go beyond vid_maxwidth i = 0; while (i < *nummodes) { if (modelist[i].width == width && modelist[i].height == height) break; i++; } if (i < *nummodes) { Cvar_SetValue ("vid_mode", i); } else if ( (width <= vid_maxwidth && width >= MIN_WIDTH && height <= vid_maxheight && height >= MIN_HEIGHT) || COM_CheckParm("-force") ) { modelist[*nummodes].width = width; modelist[*nummodes].height = height; modelist[*nummodes].halfscreen = 0; modelist[*nummodes].fullscreen = 1; modelist[*nummodes].bpp = 8; q_snprintf (modelist[*nummodes].modedesc, MAX_DESC, "%d x %d (user mode)", width, height); Cvar_SetValue ("vid_mode", *nummodes); (*nummodes)++; } else { Con_SafePrintf ("ignoring invalid -width and/or -height arguments\n"); } vid.maxwarpwidth = WARP_WIDTH; vid.maxwarpheight = WARP_HEIGHT; vid.colormap = host_colormap; vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048)); i = VID_SetMode(vid_mode.integer, palette); if ( !i ) { if (vid_mode.integer == vid_default) Sys_Error ("Couldn't set video mode: %s", SDL_GetError()); // just one more try before dying Con_SafePrintf ("Couldn't set video mode %d\n" "Trying the default mode\n", vid_mode.integer); //Cvar_SetValue("vid_config_fscr", 0); Cvar_SetValue ("vid_mode", vid_default); i = VID_SetMode(vid_default, palette); if ( !i ) Sys_Error ("Couldn't set video mode: %s", SDL_GetError()); } // lock the early-read cvars until Host_Init is finished for (i = 0; i < (int)num_readvars; i++) Cvar_LockVar (read_vars[i]); scr_disabled_for_loading = temp; vid_initialized = true; vid_menudrawfn = VID_MenuDraw; vid_menukeyfn = VID_MenuKey; }