📄 vid_win.c
字号:
Sleep (100);
if (!force_minimized)
{
SetWindowPos (mainwindow, HWND_TOP, 0, 0, 0, 0,
SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW |
SWP_NOCOPYBITS);
SetForegroundWindow (mainwindow);
}
// fix the leftover Alt from any Alt-Tab or the like that switched us away
ClearAllStates ();
if (!msg_suppress_1)
Con_SafePrintf ("%s\n", VID_GetModeDescription (vid_modenum));
VID_SetPalette (palette);
in_mode_set = false;
vid.recalc_refdef = 1;
return true;
}
void VID_LockBuffer (void)
{
if (dibdc)
return;
lockcount++;
if (lockcount > 1)
return;
MGL_beginDirectAccess();
if (memdc)
{
// Update surface pointer for linear access modes
vid.buffer = vid.conbuffer = vid.direct = memdc->surface;
vid.rowbytes = vid.conrowbytes = memdc->mi.bytesPerLine;
}
else if (mgldc)
{
// Update surface pointer for linear access modes
vid.buffer = vid.conbuffer = vid.direct = mgldc->surface;
vid.rowbytes = vid.conrowbytes = mgldc->mi.bytesPerLine;
}
if (r_dowarp)
d_viewbuffer = r_warpbuffer;
else
d_viewbuffer = (void *)(byte *)vid.buffer;
if (r_dowarp)
screenwidth = WARP_WIDTH;
else
screenwidth = vid.rowbytes;
if (lcd_x->value)
screenwidth <<= 1;
}
void VID_UnlockBuffer (void)
{
if (dibdc)
return;
lockcount--;
if (lockcount > 0)
return;
if (lockcount < 0)
Sys_Error ("Unbalanced unlock");
MGL_endDirectAccess();
// to turn up any unlocked accesses
vid.buffer = vid.conbuffer = vid.direct = d_viewbuffer = NULL;
}
int VID_ForceUnlockedAndReturnState (void)
{
int lk;
if (!lockcount)
return 0;
lk = lockcount;
if (dibdc)
{
lockcount = 0;
}
else
{
lockcount = 1;
VID_UnlockBuffer ();
}
return lk;
}
void VID_ForceLockState (int lk)
{
if (!dibdc && lk)
{
lockcount = 0;
VID_LockBuffer ();
}
lockcount = lk;
}
void VID_SetPalette (unsigned char *palette)
{
INT i;
palette_t pal[256];
HDC hdc;
if (!Minimized)
{
palette_changed = true;
// make sure we have the static colors if we're the active app
hdc = GetDC(NULL);
if (vid_palettized && ActiveApp)
{
if (GetSystemPaletteUse(hdc) == SYSPAL_STATIC)
{
// switch to SYSPAL_NOSTATIC and remap the colors
SetSystemPaletteUse(hdc, SYSPAL_NOSTATIC);
syscolchg = true;
pal_is_nostatic = true;
}
}
ReleaseDC(NULL,hdc);
// Translate the palette values to an MGL palette array and
// set the values.
for (i = 0; i < 256; i++)
{
pal[i].red = palette[i*3];
pal[i].green = palette[i*3+1];
pal[i].blue = palette[i*3+2];
}
if (DDActive)
{
if (!mgldc)
return;
MGL_setPalette(mgldc,pal,256,0);
MGL_realizePalette(mgldc,256,0,false);
if (memdc)
MGL_setPalette(memdc,pal,256,0);
}
else
{
if (!windc)
return;
MGL_setPalette(windc,pal,256,0);
MGL_realizePalette(windc,256,0,false);
if (dibdc)
{
MGL_setPalette(dibdc,pal,256,0);
MGL_realizePalette(dibdc,256,0,false);
}
}
}
memcpy (vid_curpal, palette, sizeof(vid_curpal));
if (syscolchg)
{
PostMessage (HWND_BROADCAST, WM_SYSCOLORCHANGE, (WPARAM)0, (LPARAM)0);
syscolchg = false;
}
}
void VID_ShiftPalette (unsigned char *palette)
{
VID_SetPalette (palette);
}
/*
=================
VID_DescribeCurrentMode_f
=================
*/
void VID_DescribeCurrentMode_f (void)
{
Con_Printf ("%s\n", VID_GetExtModeDescription (vid_modenum));
}
/*
=================
VID_NumModes_f
=================
*/
void VID_NumModes_f (void)
{
if (nummodes == 1)
Con_Printf ("%d video mode is available\n", nummodes);
else
Con_Printf ("%d video modes are available\n", nummodes);
}
/*
=================
VID_DescribeMode_f
=================
*/
void VID_DescribeMode_f (void)
{
int modenum;
modenum = Q_atoi (Cmd_Argv(1));
Con_Printf ("%s\n", VID_GetExtModeDescription (modenum));
}
/*
=================
VID_DescribeModes_f
=================
*/
void VID_DescribeModes_f (void)
{
int i, lnummodes;
char *pinfo;
qboolean na;
vmode_t *pv;
na = false;
lnummodes = VID_NumModes ();
for (i=0 ; i<lnummodes ; i++)
{
pv = VID_GetModePtr (i);
pinfo = VID_GetExtModeDescription (i);
if (VID_CheckAdequateMem (pv->width, pv->height))
{
Con_Printf ("%2d: %s\n", i, pinfo);
}
else
{
Con_Printf ("**: %s\n", pinfo);
na = true;
}
}
if (na)
{
Con_Printf ("\n[**: not enough system RAM for mode]\n");
}
}
/*
=================
VID_TestMode_f
=================
*/
void VID_TestMode_f (void)
{
int modenum;
double testduration;
if (!vid_testingmode)
{
modenum = Q_atoi (Cmd_Argv(1));
if (VID_SetMode (modenum, vid_curpal))
{
vid_testingmode = 1;
testduration = Q_atof (Cmd_Argv(2));
if (testduration == 0)
testduration = 5.0;
vid_testendtime = realtime + testduration;
}
}
}
/*
=================
VID_Windowed_f
=================
*/
void VID_Windowed_f (void)
{
VID_SetMode ((int)vid_windowed_mode->value, vid_curpal);
}
/*
=================
VID_Fullscreen_f
=================
*/
void VID_Fullscreen_f (void)
{
VID_SetMode ((int)vid_fullscreen_mode->value, vid_curpal);
}
/*
=================
VID_Minimize_f
=================
*/
void VID_Minimize_f (void)
{
// we only support minimizing windows; if you're fullscreen,
// switch to windowed first
if (modestate == MS_WINDOWED)
ShowWindow (mainwindow, SW_MINIMIZE);
}
/*
=================
VID_ForceMode_f
=================
*/
void VID_ForceMode_f (void)
{
int modenum;
double testduration;
if (!vid_testingmode)
{
modenum = Q_atoi (Cmd_Argv(1));
force_mode_set = 1;
VID_SetMode (modenum, vid_curpal);
force_mode_set = 0;
}
}
// 2001-09-18 New cvar system by Maddes (Init) start
void VID_Init_Cvars (void)
{
vid_mode = Cvar_Get ("vid_mode", "0", CVAR_ORIGINAL);
vid_wait = Cvar_Get ("vid_wait", "0", CVAR_ORIGINAL);
vid_nopageflip = Cvar_Get ("vid_nopageflip", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_wait_override = Cvar_Get ("_vid_wait_override", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode = Cvar_Get ("_vid_default_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode_win = Cvar_Get ("_vid_default_mode_win", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_x = Cvar_Get ("vid_config_x", "800", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_y = Cvar_Get ("vid_config_y", "600", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_stretch_by_2 = Cvar_Get ("vid_stretch_by_2", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
_windowed_mouse = Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_fullscreen_mode = Cvar_Get ("vid_fullscreen_mode", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_windowed_mode = Cvar_Get ("vid_windowed_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
block_switch = Cvar_Get ("block_switch", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_window_x = Cvar_Get ("vid_window_x", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_window_y = Cvar_Get ("vid_window_y", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
}
// 2001-09-18 New cvar system by Maddes (Init) end
void VID_Init (unsigned char *palette)
{
int i, bestmatch, bestmatchmetric, t, dr, dg, db;
int basenummodes;
byte *ptmp;
// 2001-09-18 New cvar system by Maddes (Init) start
/*
vid_mode = Cvar_Get ("vid_mode", "0", CVAR_ORIGINAL);
vid_wait = Cvar_Get ("vid_wait", "0", CVAR_ORIGINAL);
vid_nopageflip = Cvar_Get ("vid_nopageflip", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_wait_override = Cvar_Get ("_vid_wait_override", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode = Cvar_Get ("_vid_default_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
_vid_default_mode_win = Cvar_Get ("_vid_default_mode_win", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_x = Cvar_Get ("vid_config_x", "800", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_config_y = Cvar_Get ("vid_config_y", "600", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_stretch_by_2 = Cvar_Get ("vid_stretch_by_2", "1", CVAR_ARCHIVE|CVAR_ORIGINAL);
_windowed_mouse = Cvar_Get ("_windowed_mouse", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_fullscreen_mode = Cvar_Get ("vid_fullscreen_mode", "3", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_windowed_mode = Cvar_Get ("vid_windowed_mode", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
block_switch = Cvar_Get ("block_switch", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_window_x = Cvar_Get ("vid_window_x", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
vid_window_y = Cvar_Get ("vid_window_y", "0", CVAR_ARCHIVE|CVAR_ORIGINAL);
*/
// 2001-09-18 New cvar system by Maddes (Init) end
Cmd_AddCommand ("vid_testmode", VID_TestMode_f);
Cmd_AddCommand ("vid_nummodes", VID_NumModes_f);
Cmd_AddCommand ("vid_describecurrentmode", VID_DescribeCurrentMode_f);
Cmd_AddCommand ("vid_describemode", VID_DescribeMode_f);
Cmd_AddCommand ("vid_describemodes", VID_DescribeModes_f);
Cmd_AddCommand ("vid_forcemode", VID_ForceMode_f);
Cmd_AddCommand ("vid_windowed", VID_Windowed_f);
Cmd_AddCommand ("vid_fullscreen", VID_Fullscreen_f);
Cmd_AddCommand ("vid_minimize", VID_Minimize_f);
if (COM_CheckParm ("-dibonly"))
dibonly = true;
VID_InitMGLDIB (global_hInstance);
basenummodes = nummodes;
if (!dibonly)
VID_InitMGLFull (global_hInstance);
// if there are no non-windowed modes, or only windowed and mode 0x13, then use
// fullscreen DIBs as well
if (((nummodes == basenummodes) ||
((nummodes == (basenummodes + 1)) && is_mode0x13)) &&
!COM_CheckParm ("-nofulldib"))
{
VID_InitFullDIB (global_hInstance);
}
vid.maxwarpwidth = WARP_WIDTH;
vid.maxwarpheight = WARP_HEIGHT;
vid.colormap = host_colormap;
vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
vid_testingmode = 0;
// GDI doesn't let us remap palette index 0, so we'll remap color
// mappings from that black to another one
bestmatchmetric = 256*256*3;
for (i=1 ; i<256 ; i++)
{
dr = palette[0] - palette[i*3];
dg = palette[1] - palette[i*3+1];
db = palette[2] - palette[i*3+2];
t = (dr * dr) + (dg * dg) + (db * db);
if (t < bestmatchmetric)
{
bestmatchmetric = t;
bestmatch = i;
if (t == 0)
break;
}
}
for (i=0, ptmp = vid.colormap ; i<(1<<(VID_CBITS+8)) ; i++, ptmp++)
{
if (*ptmp == 0)
*ptmp = bestmatch;
}
if (COM_CheckParm("-startwindowed"))
{
startwindowed = 1;
vid_default = windowed_default;
}
if (hwnd_dialog)
DestroyWindow (hwnd_dialog);
// sound initialization has to go here, preceded by a windowed mode set,
// so there's a window for DirectSound to work with but we're not yet
// fullscreen so the "hardware already in use" dialog is visible if it
// gets displayed
// keep the window minimized until we're ready for the first real mode set
hide_window = true;
VID_SetMode (MODE_WINDOWED, palette);
hide_window = false;
S_Init ();
vid_initialized = true;
force_mode_set = true;
VID_SetMode (vid_default, palette);
force_mode_set = false;
vid_realmode = vid_modenum;
VID_SetPalette (palette);
vid_menudrawfn = VID_MenuDraw;
vid_menukeyfn = VID_MenuKey;
strcpy (badmode.modedesc, "Bad mode");
}
void VID_Shutdown (void)
{
HDC hdc;
int dummy;
if (vid_initialized)
{
if (modestate == MS_FULLDIB)
ChangeDisplaySettings (NULL, CDS_FULLSCREEN);
PostMessage (HWND_BROADCAST, WM_PALETTECHANGED, (WPARAM)mainwindow, (LPARAM)0);
PostMessage (HWND_BROADCAST, WM_SYSCOLORCHANGE, (WPARAM)0, (LPARAM)0);
AppActivate(false, false);
DestroyDIBWindow ();
DestroyFullscreenWindow ();
DestroyFullDIBWindow ();
if (hwnd_dialog)
DestroyWindow (hwnd_dialog);
if (mainwindow)
DestroyWindow(mainwindow);
MGL_exit();
vid_testingmode = 0;
vid_initialized = 0;
}
}
/*
================
FlipScreen
================
*/
void FlipScreen(vrect_t *rects)
{
HRESULT ddrval;
// Flip the surfaces
if (DDActive)
{
if (mgldc)
{
if (memdc)
{
while (rects)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -