You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
199 lines
4.8 KiB
199 lines
4.8 KiB
/******************************Module*Header*******************************\
|
|
* Module Name: pixelfmt.c
|
|
*
|
|
* Client side stubs for pixel format functions.
|
|
*
|
|
* Created: 17-Sep-1993
|
|
* Author: Hock San Lee [hockl]
|
|
*
|
|
* Copyright (c) 1993-1999 Microsoft Corporation
|
|
\**************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
static char szOpenGL[] = "OPENGL32";
|
|
|
|
typedef int (WINAPI *PFN1)(HDC, CONST PIXELFORMATDESCRIPTOR *);
|
|
typedef int (WINAPI *PFN2)(HDC, int, UINT, LPPIXELFORMATDESCRIPTOR);
|
|
typedef int (WINAPI *PFN3)(HDC);
|
|
typedef BOOL (WINAPI *PFN4)(HDC, int, CONST PIXELFORMATDESCRIPTOR *);
|
|
typedef BOOL (WINAPI *PFN5)(HDC);
|
|
|
|
BOOL gbSetPixelFormatCalled = FALSE;
|
|
|
|
// In these routines the assumption is that OpenGL is already loaded
|
|
// For that case, the LoadLibrary/FreeLibrary calls will simply
|
|
// increment and decrement the reference count of the DLL, so they
|
|
// won't be too expensive
|
|
//
|
|
// In the case where OpenGL is not loaded the DLL will be brought in
|
|
// for the duration of the call only
|
|
|
|
/***********************************************************************/
|
|
|
|
__inline FARPROC GetAPI(char *szDll, char *szAPI, HMODULE *phDll)
|
|
{
|
|
*phDll = LoadLibraryA(szDll);
|
|
|
|
if (*phDll == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
return GetProcAddress(*phDll, szAPI);
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
int WINAPI ChoosePixelFormat(HDC hdc, CONST PIXELFORMATDESCRIPTOR *ppfd)
|
|
{
|
|
HMODULE hDll;
|
|
PFN1 pfn = (PFN1)GetAPI(szOpenGL, "wglChoosePixelFormat", &hDll);
|
|
int ipfd = 0;
|
|
|
|
if (pfn)
|
|
{
|
|
ipfd = (*pfn)(hdc, ppfd);
|
|
}
|
|
|
|
if (hDll)
|
|
{
|
|
FreeLibrary(hDll);
|
|
}
|
|
|
|
return ipfd;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
int WINAPI DescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes,
|
|
LPPIXELFORMATDESCRIPTOR ppfd)
|
|
{
|
|
HMODULE hDll;
|
|
PFN2 pfn = (PFN2)GetAPI(szOpenGL, "wglDescribePixelFormat", &hDll);
|
|
int ipfd = 0;
|
|
|
|
if (pfn)
|
|
{
|
|
ipfd = (*pfn)(hdc, iPixelFormat, nBytes, ppfd);
|
|
}
|
|
|
|
if (hDll)
|
|
{
|
|
FreeLibrary(hDll);
|
|
}
|
|
|
|
return ipfd;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
int WINAPI GetPixelFormat(HDC hdc)
|
|
{
|
|
int ipfd = 0;
|
|
|
|
if (gbSetPixelFormatCalled)
|
|
{
|
|
HMODULE hDll;
|
|
PFN3 pfn = (PFN3)GetAPI(szOpenGL, "wglGetPixelFormat", &hDll);
|
|
|
|
if (pfn)
|
|
{
|
|
ipfd = (*pfn)(hdc);
|
|
}
|
|
|
|
if (hDll)
|
|
{
|
|
FreeLibrary(hDll);
|
|
}
|
|
}
|
|
|
|
return ipfd;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
BOOL WINAPI SetPixelFormat(HDC hdc, int iPixelFormat,
|
|
CONST PIXELFORMATDESCRIPTOR *ppfd)
|
|
{
|
|
HMODULE hDll;
|
|
PFN4 pfn = (PFN4)GetAPI(szOpenGL, "wglSetPixelFormat", &hDll);
|
|
BOOL bRet = FALSE;
|
|
|
|
gbSetPixelFormatCalled = TRUE;
|
|
|
|
if (pfn)
|
|
{
|
|
bRet = (*pfn)(hdc, iPixelFormat, ppfd);
|
|
|
|
// Metafile if necessary
|
|
if (bRet)
|
|
{
|
|
if (IS_ALTDC_TYPE(hdc) && !IS_METADC16_TYPE(hdc))
|
|
{
|
|
PLDC pldc;
|
|
|
|
DC_PLDC(hdc, pldc, FALSE);
|
|
|
|
if (pldc->iType == LO_METADC)
|
|
{
|
|
if (!MF_SetPixelFormat(hdc, iPixelFormat, ppfd))
|
|
{
|
|
bRet = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hDll)
|
|
{
|
|
FreeLibrary(hDll);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
BOOL WINAPI SwapBuffers(HDC hdc)
|
|
{
|
|
HMODULE hDll;
|
|
PFN5 pfn = (PFN5)GetAPI(szOpenGL, "wglSwapBuffers", &hDll);
|
|
BOOL bRet = FALSE;
|
|
|
|
if (pfn)
|
|
{
|
|
bRet = (*pfn)(hdc);
|
|
}
|
|
|
|
if (hDll)
|
|
{
|
|
FreeLibrary(hDll);
|
|
}
|
|
|
|
return bRet;
|
|
}
|
|
|
|
/***********************************************************************/
|
|
|
|
// These stubs are for the cases where OpenGL cannot handle the pixel
|
|
// format request itself because it involves device-specific information
|
|
// In that case OpenGL asks GDI to go ask the display driver in kernel
|
|
// mode
|
|
|
|
int APIENTRY GdiDescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes,
|
|
LPPIXELFORMATDESCRIPTOR ppfd)
|
|
{
|
|
return NtGdiDescribePixelFormat(hdc, iPixelFormat, nBytes, ppfd);
|
|
}
|
|
|
|
BOOL APIENTRY GdiSetPixelFormat(HDC hdc, int iPixelFormat)
|
|
{
|
|
return NtGdiSetPixelFormat(hdc, iPixelFormat);
|
|
}
|
|
|
|
BOOL APIENTRY GdiSwapBuffers(HDC hdc)
|
|
{
|
|
return NtGdiSwapBuffers(hdc);
|
|
}
|