📄 dglpf.c
字号:
lpDD1,
&IID_IDirectDraw4,
(void**)&lpDD4);
if (FAILED(hRes)) {
ddlogError(DDLOG_ERROR, "dglBPFL: QueryInterface (DD4) failed", hRes);
goto clean_up;
}
// Retrieve caps of current display mode
ZeroMemory(&ddsdDisplayMode, sizeof(ddsdDisplayMode));
ddsdDisplayMode.dwSize = sizeof(ddsdDisplayMode);
hRes = IDirectDraw4_GetDisplayMode(lpDD4, &ddsdDisplayMode);
if (FAILED(hRes))
goto clean_up;
dwDisplayBitDepth = ddsdDisplayMode.ddpfPixelFormat.dwRGBBitCount;
dwPixelType = (dwDisplayBitDepth <= 8) ? PFD_TYPE_COLORINDEX : PFD_TYPE_RGBA;
dwRb = BitCount(ddsdDisplayMode.ddpfPixelFormat.dwRBitMask);
dwGb = BitCount(ddsdDisplayMode.ddpfPixelFormat.dwGBitMask);
dwBb = BitCount(ddsdDisplayMode.ddpfPixelFormat.dwBBitMask);
dwRs = BitShift(ddsdDisplayMode.ddpfPixelFormat.dwRBitMask);
dwGs = BitShift(ddsdDisplayMode.ddpfPixelFormat.dwGBitMask);
dwBs = BitShift(ddsdDisplayMode.ddpfPixelFormat.dwBBitMask);
if (BitCount(ddsdDisplayMode.ddpfPixelFormat.dwRGBAlphaBitMask)) {
dwAb = BitCount(ddsdDisplayMode.ddpfPixelFormat.dwRGBAlphaBitMask);
dwAs = BitShift(ddsdDisplayMode.ddpfPixelFormat.dwRGBAlphaBitMask);
} else {
dwAb = 0;
dwAs = 0;
}
// Query for available display modes
ddlogMessage(DDLOG_INFO, "\n");
ddlogMessage(DDLOG_INFO, "Display Modes:\n");
// Pass 1: Determine count
iEnumCount = 0;
hRes = IDirectDraw4_EnumDisplayModes(
lpDD4,
0,
NULL,
NULL,
EnumDisplayModesCallback);
if (FAILED(hRes)) {
ddlogError(DDLOG_ERROR, "dglBPFL: EnumDisplayModes failed", hRes);
goto clean_up;
}
if (iEnumCount == 0) {
ddlogMessage(DDLOG_ERROR, "dglBPFL: No display modes found");
goto clean_up;
}
glb.lpDisplayModes = (DDSURFACEDESC2 *)calloc(iEnumCount,
sizeof(DDSURFACEDESC2));
if (glb.lpDisplayModes == NULL) {
ddlogMessage(DDLOG_ERROR, "dglBPFL: DDSURFACEDESC2 calloc failed");
goto clean_up;
}
glb.nDisplayModeCount = iEnumCount;
// Pass 2: Save modes
iEnumCount = 0;
hRes = IDirectDraw4_EnumDisplayModes(
lpDD4,
0,
NULL,
(void *)glb.lpDisplayModes,
EnumDisplayModesCallback);
if (FAILED(hRes)) {
ddlogError(DDLOG_ERROR, "dglBPFL: EnumDisplayModes failed", hRes);
goto clean_up;
}
// Query for IDirect3D3 interface
hRes = IDirectDraw4_QueryInterface(
lpDD4,
&IID_IDirect3D3,
(void**)&lpD3D3);
if (FAILED(hRes)) {
ddlogError(DDLOG_ERROR, "dglBPFL: QueryInterface (D3D3) failed", hRes);
goto clean_up;
}
ddlogMessage(DDLOG_INFO, "\n");
ddlogMessage(DDLOG_INFO, "ZBuffer formats:\n");
// Pass 1. Count the ZBuffer pixel formats
hRes = IDirect3D3_EnumZBufferFormats(
lpD3D3,
&glb.d3dGuid,
d3dEnumZBufferFormatsCallback,
NULL);
if (FAILED(hRes))
goto clean_up;
if (glb.nZBufferPFCount) {
glb.lpZBufferPF = (DDPIXELFORMAT *)calloc(glb.nZBufferPFCount,
sizeof(DDPIXELFORMAT));
if(glb.lpZBufferPF == NULL)
goto clean_up;
// Pass 2. Cache the ZBuffer pixel formats
iEnumCount = 0; // (Used by the enum function)
hRes = IDirect3D3_EnumZBufferFormats(
lpD3D3,
&glb.d3dGuid,
d3dEnumZBufferFormatsCallback,
glb.lpZBufferPF);
if (FAILED(hRes))
goto clean_up;
}
// Remove stencil support for boards which don't work for AutoCAD;
// Matrox G400 does not work, but NVidia TNT2 and ATI Rage128 do... (DaveM)
if (IsStencilSupportBroken(lpDD4)) {
for (i=0; i<iEnumCount; i++)
if (glb.lpZBufferPF[i].dwFlags & DDPF_STENCILBUFFER)
glb.nZBufferPFCount--;
}
// One each for every ZBuffer pixel format (including no depth buffer)
// Times-two because duplicated for single buffering (as opposed to double)
glb.nPixelFormatCount = 2 * (glb.nZBufferPFCount + 1);
glb.lpPF = (DGL_pixelFormat *)calloc(glb.nPixelFormatCount,
sizeof(DGL_pixelFormat));
if (glb.lpPF == NULL)
goto clean_up;
//
// Fill in the pixel formats
// Note: Depth buffer bits are really (dwZBufferBitDepth-dwStencilBitDepth)
// but this will pass wierd numbers to the OpenGL app. (?)
//
pfTemplateHW.pfd.iPixelType = dwPixelType;
pfTemplateHW.pfd.cColorBits = dwDisplayBitDepth;
pfTemplateHW.pfd.cRedBits = dwRb;
pfTemplateHW.pfd.cGreenBits = dwGb;
pfTemplateHW.pfd.cBlueBits = dwBb;
pfTemplateHW.pfd.cAlphaBits = dwAb;
pfTemplateHW.pfd.cRedShift = dwRs;
pfTemplateHW.pfd.cGreenShift = dwGs;
pfTemplateHW.pfd.cBlueShift = dwBs;
pfTemplateHW.pfd.cAlphaShift = dwAs;
lpPF = glb.lpPF;
// Fill in the double-buffered pixel formats
for (i=0; i<(glb.nZBufferPFCount + 1); i++, lpPF++) {
memcpy(lpPF, &pfTemplateHW, sizeof(DGL_pixelFormat));
if (i) {
lpPF->iZBufferPF = i-1;
lpPF->pfd.cDepthBits = glb.lpZBufferPF[i-1].dwZBufferBitDepth;
lpPF->pfd.cStencilBits = glb.lpZBufferPF[i-1].dwStencilBitDepth;
}
}
// Fill in the single-buffered pixel formats
for (i=0; i<(glb.nZBufferPFCount + 1); i++, lpPF++) {
memcpy(lpPF, &pfTemplateHW, sizeof(DGL_pixelFormat));
if (i) {
lpPF->iZBufferPF = i-1;
lpPF->pfd.cDepthBits = glb.lpZBufferPF[i-1].dwZBufferBitDepth;
lpPF->pfd.cStencilBits = glb.lpZBufferPF[i-1].dwStencilBitDepth;
}
// Remove double-buffer flag. Could use XOR instead...
lpPF->pfd.dwFlags &= (~(PFD_DOUBLEBUFFER));
// Insert GDI flag for single buffered format only.
lpPF->pfd.dwFlags |= PFD_SUPPORT_GDI;
}
#endif // _USE_GLD3_WGL
// Lets dump the list to the log
// ** Based on "wglinfo" by Nate Robins **
ddlogMessage(DDLOG_INFO, "\n");
ddlogMessage(DDLOG_INFO, "Pixel Formats:\n");
ddlogMessage(DDLOG_INFO,
" visual x bf lv rg d st r g b a ax dp st accum buffs ms\n");
ddlogMessage(DDLOG_INFO,
" id dep cl sp sz l ci b ro sz sz sz sz bf th cl r g b a ns b\n");
ddlogMessage(DDLOG_INFO,
"-----------------------------------------------------------------\n");
for (i=0, lpPF = glb.lpPF; i<glb.nPixelFormatCount; i++, lpPF++) {
sprintf(buf, "0x%02x ", i+1);
sprintf(cat, "%2d ", lpPF->pfd.cColorBits);
strcat(buf, cat);
if(lpPF->pfd.dwFlags & PFD_DRAW_TO_WINDOW) sprintf(cat, "wn ");
else if(lpPF->pfd.dwFlags & PFD_DRAW_TO_BITMAP) sprintf(cat, "bm ");
else sprintf(cat, ". ");
strcat(buf, cat);
/* should find transparent pixel from LAYERPLANEDESCRIPTOR */
sprintf(cat, " . ");
strcat(buf, cat);
sprintf(cat, "%2d ", lpPF->pfd.cColorBits);
strcat(buf, cat);
/* bReserved field indicates number of over/underlays */
if(lpPF->pfd.bReserved) sprintf(cat, " %d ", lpPF->pfd.bReserved);
else sprintf(cat, " . ");
strcat(buf, cat);
sprintf(cat, " %c ", lpPF->pfd.iPixelType == PFD_TYPE_RGBA ? 'r' : 'c');
strcat(buf, cat);
sprintf(cat, "%c ", lpPF->pfd.dwFlags & PFD_DOUBLEBUFFER ? 'y' : '.');
strcat(buf, cat);
sprintf(cat, " %c ", lpPF->pfd.dwFlags & PFD_STEREO ? 'y' : '.');
strcat(buf, cat);
if(lpPF->pfd.cRedBits && lpPF->pfd.iPixelType == PFD_TYPE_RGBA)
sprintf(cat, "%2d ", lpPF->pfd.cRedBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cGreenBits && lpPF->pfd.iPixelType == PFD_TYPE_RGBA)
sprintf(cat, "%2d ", lpPF->pfd.cGreenBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cBlueBits && lpPF->pfd.iPixelType == PFD_TYPE_RGBA)
sprintf(cat, "%2d ", lpPF->pfd.cBlueBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAlphaBits && lpPF->pfd.iPixelType == PFD_TYPE_RGBA)
sprintf(cat, "%2d ", lpPF->pfd.cAlphaBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAuxBuffers) sprintf(cat, "%2d ", lpPF->pfd.cAuxBuffers);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cDepthBits) sprintf(cat, "%2d ", lpPF->pfd.cDepthBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cStencilBits) sprintf(cat, "%2d ", lpPF->pfd.cStencilBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAccumRedBits) sprintf(cat, "%2d ", lpPF->pfd.cAccumRedBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAccumGreenBits) sprintf(cat, "%2d ", lpPF->pfd.cAccumGreenBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAccumBlueBits) sprintf(cat, "%2d ", lpPF->pfd.cAccumBlueBits);
else sprintf(cat, " . ");
strcat(buf, cat);
if(lpPF->pfd.cAccumAlphaBits) sprintf(cat, "%2d ", lpPF->pfd.cAccumAlphaBits);
else sprintf(cat, " . ");
strcat(buf, cat);
/* no multisample in Win32 */
sprintf(cat, " . .\n");
strcat(buf, cat);
ddlogMessage(DDLOG_INFO, buf);
}
ddlogMessage(DDLOG_INFO,
"-----------------------------------------------------------------\n");
ddlogMessage(DDLOG_INFO, "\n");
#ifndef _USE_GLD3_WGL
clean_up:
// Release COM objects
RELEASE(lpD3D3);
RELEASE(lpDD4);
RELEASE(lpDD1);
// Popup warning message if non RGB color mode
if (dwDisplayBitDepth <= 8) {
ddlogPrintf(DDLOG_WARN, "Current Color Depth %d bpp is not supported", dwDisplayBitDepth);
MessageBox(NULL, szColorDepthWarning, "GLDirect", MB_OK | MB_ICONWARNING);
}
#endif // _USE_GLD3_WGL
}
// ***********************************************************************
void dglReleasePixelFormatList()
{
glb.nPixelFormatCount = 0;
if (glb.lpPF) {
free(glb.lpPF);
glb.lpPF = NULL;
}
#ifndef _USE_GLD3_WGL
glb.nZBufferPFCount = 0;
if (glb.lpZBufferPF) {
free(glb.lpZBufferPF);
glb.lpZBufferPF = NULL;
}
glb.nDisplayModeCount = 0;
if (glb.lpDisplayModes) {
free(glb.lpDisplayModes);
glb.lpDisplayModes = NULL;
}
#endif // _USE_GLD3_WGL
}
// ***********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -