📄 vid_win.c
字号:
if (npages > 3)
npages = 3;
if (!COM_CheckParm ("-notriplebuf"))
{
if (npages > 2)
{
npages = 2;
}
}
if ((dc = MGL_createDisplayDC(npages)) == NULL)
return NULL;
if (!forcemem && (MGL_surfaceAccessType(dc)) == MGL_LINEAR_ACCESS && (dc->mi.maxPage > 0))
{
MGL_makeCurrentDC(dc);
memdc = NULL;
}
else
{
// Set up for blitting from a memory buffer
memdc = MGL_createMemoryDC(MGL_sizex(dc)+1,MGL_sizey(dc)+1,8,&pf);
MGL_makeCurrentDC(memdc);
}
// Enable page flipping even for even for blitted surfaces
if (forcemem)
{
vid.numpages = 1;
}
else
{
vid.numpages = dc->mi.maxPage + 1;
if (vid.numpages > 1)
{
// Set up for page flipping
MGL_setActivePage(dc, aPage = 1);
MGL_setVisualPage(dc, vPage = 0, false);
}
if (vid.numpages > 3)
vid.numpages = 3;
}
if (vid.numpages == 2)
waitVRT = true;
else
waitVRT = false;
return dc;
}
void VID_InitMGLDIB (HINSTANCE hInstance)
{
WNDCLASS wc;
HDC hdc;
int i;
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON1));
/* Register the frame class */
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = 0;
wc.hCursor = LoadCursor (NULL,IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = 0;
wc.lpszClassName = "WinQuake";
if (!RegisterClass (&wc) )
Sys_Error ("Couldn't register window class");
/* Find the size for the DIB window */
/* Initialise the MGL for windowed operation */
MGL_setAppInstance(hInstance);
registerAllMemDrivers();
MGL_initWindowed("");
modelist[0].type = MS_WINDOWED;
modelist[0].width = 320;
modelist[0].height = 240;
strcpy (modelist[0].modedesc, "320x240");
modelist[0].mode13 = 0;
modelist[0].modenum = MODE_WINDOWED;
modelist[0].stretched = 0;
modelist[0].dib = 1;
modelist[0].fullscreen = 0;
modelist[0].halfscreen = 0;
modelist[0].bpp = 8;
modelist[1].type = MS_WINDOWED;
modelist[1].width = 640;
modelist[1].height = 480;
strcpy (modelist[1].modedesc, "640x480");
modelist[1].mode13 = 0;
modelist[1].modenum = MODE_WINDOWED + 1;
modelist[1].stretched = 1;
modelist[1].dib = 1;
modelist[1].fullscreen = 0;
modelist[1].halfscreen = 0;
modelist[1].bpp = 8;
modelist[2].type = MS_WINDOWED;
modelist[2].width = 800;
modelist[2].height = 600;
strcpy (modelist[2].modedesc, "800x600");
modelist[2].mode13 = 0;
modelist[2].modenum = MODE_WINDOWED + 2;
modelist[2].stretched = 1;
modelist[2].dib = 1;
modelist[2].fullscreen = 0;
modelist[2].halfscreen = 0;
modelist[2].bpp = 8;
// automatically stretch the default mode up if > 640x480 desktop resolution
hdc = GetDC(NULL);
if ((GetDeviceCaps(hdc, HORZRES) > 640) && !COM_CheckParm("-noautostretch"))
{
vid_default = MODE_WINDOWED + 1;
}
else
{
vid_default = MODE_WINDOWED;
}
windowed_default = vid_default;
ReleaseDC(NULL,hdc);
nummodes = 3; // reserve space for windowed mode
DDActive = 0;
}
/*
=================
VID_InitFullDIB
=================
*/
void VID_InitFullDIB (HINSTANCE hInstance)
{
DEVMODE devmode;
int i, j, modenum, cmodes, existingmode, originalnummodes, lowestres;
int numlowresmodes, bpp, done;
int cstretch, istretch, mstretch;
BOOL stat;
// enumerate 8 bpp modes
originalnummodes = nummodes;
modenum = 0;
lowestres = 99999;
do
{
stat = EnumDisplaySettings (NULL, modenum, &devmode);
if ((devmode.dmBitsPerPel == 8) &&
(devmode.dmPelsWidth <= MAXWIDTH) &&
(devmode.dmPelsHeight <= MAXHEIGHT) &&
(nummodes < MAX_MODE_LIST))
{
devmode.dmFields = DM_BITSPERPEL |
DM_PELSWIDTH |
DM_PELSHEIGHT;
if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
DISP_CHANGE_SUCCESSFUL)
{
modelist[nummodes].type = MS_FULLDIB;
modelist[nummodes].width = devmode.dmPelsWidth;
modelist[nummodes].height = devmode.dmPelsHeight;
modelist[nummodes].modenum = 0;
modelist[nummodes].mode13 = 0;
modelist[nummodes].stretched = 0;
modelist[nummodes].halfscreen = 0;
modelist[nummodes].dib = 1;
modelist[nummodes].fullscreen = 1;
modelist[nummodes].bpp = devmode.dmBitsPerPel;
sprintf (modelist[nummodes].modedesc, "%dx%d",
devmode.dmPelsWidth, devmode.dmPelsHeight);
// if the width is more than twice the height, reduce it by half because this
// is probably a dual-screen monitor
if (!COM_CheckParm("-noadjustaspect"))
{
if (modelist[nummodes].width > (modelist[nummodes].height << 1))
{
modelist[nummodes].width >>= 1;
modelist[nummodes].halfscreen = 1;
sprintf (modelist[nummodes].modedesc, "%dx%d",
modelist[nummodes].width,
modelist[nummodes].height);
}
}
for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
{
if ((modelist[nummodes].width == modelist[i].width) &&
(modelist[nummodes].height == modelist[i].height))
{
existingmode = 1;
break;
}
}
if (!existingmode)
{
if (modelist[nummodes].width < lowestres)
lowestres = modelist[nummodes].width;
nummodes++;
}
}
}
modenum++;
} while (stat);
// see if any of them were actually settable; if so, this is our mode list,
// else enumerate all modes; our mode list is whichever ones are settable
// with > 8 bpp
if (nummodes == originalnummodes)
{
modenum = 0;
lowestres = 99999;
Con_SafePrintf ("No 8-bpp fullscreen DIB modes found\n");
do
{
stat = EnumDisplaySettings (NULL, modenum, &devmode);
if ((((devmode.dmPelsWidth <= MAXWIDTH) &&
(devmode.dmPelsHeight <= MAXHEIGHT)) ||
(!COM_CheckParm("-noadjustaspect") &&
(devmode.dmPelsWidth <= (MAXWIDTH*2)) &&
(devmode.dmPelsWidth > (devmode.dmPelsHeight*2)))) &&
(nummodes < MAX_MODE_LIST) &&
(devmode.dmBitsPerPel > 8))
{
devmode.dmFields = DM_BITSPERPEL |
DM_PELSWIDTH |
DM_PELSHEIGHT;
if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
DISP_CHANGE_SUCCESSFUL)
{
modelist[nummodes].type = MS_FULLDIB;
modelist[nummodes].width = devmode.dmPelsWidth;
modelist[nummodes].height = devmode.dmPelsHeight;
modelist[nummodes].modenum = 0;
modelist[nummodes].mode13 = 0;
modelist[nummodes].stretched = 0;
modelist[nummodes].halfscreen = 0;
modelist[nummodes].dib = 1;
modelist[nummodes].fullscreen = 1;
modelist[nummodes].bpp = devmode.dmBitsPerPel;
sprintf (modelist[nummodes].modedesc, "%dx%d",
devmode.dmPelsWidth, devmode.dmPelsHeight);
// if the width is more than twice the height, reduce it by half because this
// is probably a dual-screen monitor
if (!COM_CheckParm("-noadjustaspect"))
{
if (modelist[nummodes].width > (modelist[nummodes].height*2))
{
modelist[nummodes].width >>= 1;
modelist[nummodes].halfscreen = 1;
sprintf (modelist[nummodes].modedesc, "%dx%d",
modelist[nummodes].width,
modelist[nummodes].height);
}
}
for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
{
if ((modelist[nummodes].width == modelist[i].width) &&
(modelist[nummodes].height == modelist[i].height))
{
// pick the lowest available bpp
if (modelist[nummodes].bpp < modelist[i].bpp)
modelist[i] = modelist[nummodes];
existingmode = 1;
break;
}
}
if (!existingmode)
{
if (modelist[nummodes].width < lowestres)
lowestres = modelist[nummodes].width;
nummodes++;
}
}
}
modenum++;
} while (stat);
}
// see if there are any low-res modes that aren't being reported
numlowresmodes = sizeof(lowresmodes) / sizeof(lowresmodes[0]);
bpp = 8;
done = 0;
// first make sure the driver doesn't just answer yes to all tests
devmode.dmBitsPerPel = 8;
devmode.dmPelsWidth = 42;
devmode.dmPelsHeight = 37;
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
DISP_CHANGE_SUCCESSFUL)
{
done = 1;
}
while (!done)
{
for (j=0 ; (j<numlowresmodes) && (nummodes < MAX_MODE_LIST) ; j++)
{
devmode.dmBitsPerPel = bpp;
devmode.dmPelsWidth = lowresmodes[j].width;
devmode.dmPelsHeight = lowresmodes[j].height;
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
if (ChangeDisplaySettings (&devmode, CDS_TEST | CDS_FULLSCREEN) ==
DISP_CHANGE_SUCCESSFUL)
{
modelist[nummodes].type = MS_FULLDIB;
modelist[nummodes].width = devmode.dmPelsWidth;
modelist[nummodes].height = devmode.dmPelsHeight;
modelist[nummodes].modenum = 0;
modelist[nummodes].mode13 = 0;
modelist[nummodes].stretched = 0;
modelist[nummodes].halfscreen = 0;
modelist[nummodes].dib = 1;
modelist[nummodes].fullscreen = 1;
modelist[nummodes].bpp = devmode.dmBitsPerPel;
sprintf (modelist[nummodes].modedesc, "%dx%d",
devmode.dmPelsWidth, devmode.dmPelsHeight);
// we only want the lowest-bpp version of each mode
for (i=originalnummodes, existingmode = 0 ; i<nummodes ; i++)
{
if ((modelist[nummodes].width == modelist[i].width) &&
(modelist[nummodes].height == modelist[i].height) &&
(modelist[nummodes].bpp >= modelist[i].bpp))
{
existingmode = 1;
break;
}
}
if (!existingmode)
{
if (modelist[nummodes].width < lowestres)
lowestres = modelist[nummodes].width;
nummodes++;
}
}
}
switch (bpp)
{
case 8:
bpp = 16;
break;
case 16:
bpp = 32;
break;
case 32:
done = 1;
break;
}
}
// now add the lowest stretch-by-2 pseudo-modes between 320-wide
// (inclusive) and lowest real res (not inclusive)
// don't bother if we have a real VGA mode 0x13 mode
if (!is_mode0x13)
{
for (i=originalnummodes, cstretch=0 ; i<nummodes ; i++)
{
if (((modelist[i].width >> 1) < lowestres) &&
((modelist[i].width >> 1) >= 320))
{
lowestres = modelist[i].width >> 1;
cstretch = 1;
mstretch = i;
}
}
if ((nummodes + cstretch) > MAX_MODE_LIST)
cstretch = MAX_MODE_LIST - nummodes;
if (cstretch > 0)
{
for (i=(nummodes-1) ; i>=originalnummodes ; i--)
modelist[i+cstretch] = modelist[i];
nummodes += cstretch;
istretch = originalnummodes;
modelist[istretch] = modelist[mstretch];
modelist[istretch].width >>= 1;
modelist[istretch].height >>= 1;
modelist[istretch].stretched = 1;
sprintf (modelist[istretch].modedesc, "%dx%d",
modelist[istretch].width, modelist[istretch].height);
}
}
if (nummodes != originalnummodes)
vid_default = MODE_FULLSCREEN_DEFAULT;
else
Con_SafePrintf ("No fullscreen DIB modes found\n");
}
/*
=================
VID_NumModes
=================
*/
int VID_NumModes (void)
{
return nummodes;
}
/*
=================
VID_GetModePtr
=================
*/
vmode_t *VID_GetModePtr (int modenum)
{
if ((modenum >= 0) && (modenum < nummodes))
return &modelist[modenum];
else
return &badmode;
}
/*
=================
VID_CheckModedescFixup
=================
*/
void VID_CheckModedescFixup (int mode)
{
int x, y, stretch;
if (mode == MODE_SETTABLE_WINDOW)
{
modelist[mode].stretched = (int)vid_stretch_by_2->value;
stretch = modelist[mode].stretched;
if (vid_config_x->value < (320 << stretch))
vid_config_x->value = 320 << stretch;
if (vid_config_y->value < (200 << stretch))
vid_config_y->value = 200 << stretch;
x = (int)vid_config_x->value;
y = (int)vid_config_y->value;
sprintf (modelist[mode].modedesc, "%dx%d", x, y);
modelist[mode].width = x;
modelist[mode].height = y;
}
}
/*
=================
VID_GetModeDescriptionMemCheck
=================
*/
char *VID_GetModeDescriptionMemCheck (int mode)
{
char *pinfo;
vmode_t *pv;
if ((mode < 0) || (mode >= nummodes))
return NULL;
VID_CheckModedescFixup (mode);
pv = VID_GetModePtr (mode);
pinfo = pv->modedesc;
if (VID_CheckAdequateMem (pv->width, pv->height))
{
return pinfo;
}
else
{
return NULL;
}
}
/*
=================
VID_GetModeDescription
=================
*/
char *VID_GetModeDescription (int mode)
{
char *pinfo;
vmode_t *pv;
if ((mode < 0) || (mode >= nummodes))
return NULL;
VID_CheckModedescFixup (mode);
pv = VID_GetModePtr (mode);
pinfo = pv->modedesc;
return pinfo;
}
/*
=================
VID_GetModeDescription2
Tacks on "windowed" or "fullscreen"
=================
*/
char *VID_GetModeDescription2 (int mode)
{
static char pinfo[40];
vmode_t *pv;
if ((mode < 0) || (mode >= nummodes))
return NULL;
VID_CheckModedescFixup (mode);
pv = VID_GetModePtr (mode);
if (modelist[mode].type == MS_FULLSCREEN)
{
sprintf(pinfo,"%s fullscreen", pv->modedesc);
}
else if (modelist[mode].type == MS_FULLDIB)
{
sprintf(pinfo,"%s fullscreen", pv->modedesc);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -