leocad/win/win_gl.cpp
2011-09-07 21:06:51 +00:00

177 lines
5.8 KiB
C++
Executable file

//
// Windows OpenGL functions
//
#include "stdafx.h"
#include "opengl.h"
static HMODULE gl_module;
static bool gl_ignore_GDI = false;
// ============================================================================
// Function pointers
static WGLCHOOSEPIXELFORMAT pfnwglChoosePixelFormat;
static WGLDESCRIBEPIXELFORMAT pfnwglDescribePixelFormat;
static WGLGETPIXELFORMAT pfnwglGetPixelFormat;
static WGLSETPIXELFORMAT pfnwglSetPixelFormat;
static WGLSWAPBUFFERS pfnwglSwapBuffers;
WGLCOPYCONTEXT pfnwglCopyContext;
WGLCREATECONTEXT pfnwglCreateContext;
WGLCREATELAYERCONTEXT pfnwglCreateLayerContext;
WGLDELETECONTEXT pfnwglDeleteContext;
WGLGETCURRENTCONTEXT pfnwglGetCurrentContext;
WGLGETCURRENTDC pfnwglGetCurrentDC;
WGLGETPROCADDRESS pfnwglGetProcAddress;
WGLMAKECURRENT pfnwglMakeCurrent;
WGLSHARELISTS pfnwglShareLists;
WGLUSEFONTBITMAPS pfnwglUseFontBitmaps;
WGLUSEFONTOUTLINES pfnwglUseFontOutlines;
WGLDESCRIBELAYERPLANE pfnwglDescribeLayerPlane;
WGLSETLAYERPALETTEENTRIES pfnwglSetLayerPaletteEntries;
WGLGETLAYERPALETTEENTRIES pfnwglGetLayerPaletteEntries;
WGLREALIZELAYERPALETTE pfnwglRealizeLayerPalette;
WGLSWAPLAYERBUFFERS pfnwglSwapLayerBuffers;
WGLSWAPINTERVALEXT pfnwglSwapIntervalEXT;
WGLGETDEVICEGAMMARAMPEXT pfnwglGetDeviceGammaRampEXT;
WGLSETDEVICEGAMMARAMPEXT pfnwglSetDeviceGammaRampEXT;
// ============================================================================
// Global functions
BOOL OpenGLSwapBuffers (HDC hdc)
{
if (!gl_ignore_GDI)
return SwapBuffers (hdc);
else
return pfnwglSwapBuffers (hdc);
}
int OpenGLChoosePixelFormat(HDC hdc, CONST PIXELFORMATDESCRIPTOR * ppfd)
{
if (!gl_ignore_GDI)
return ChoosePixelFormat (hdc, ppfd);
else
return pfnwglChoosePixelFormat (hdc, ppfd);
}
int OpenGLDescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd)
{
if (!gl_ignore_GDI)
return DescribePixelFormat (hdc, iPixelFormat, nBytes, ppfd);
else
return pfnwglDescribePixelFormat (hdc, iPixelFormat, nBytes, ppfd);
}
BOOL OpenGLSetPixelFormat(HDC hdc, int iPixelFormat, CONST PIXELFORMATDESCRIPTOR * ppfd)
{
if (!gl_ignore_GDI)
return SetPixelFormat (hdc, iPixelFormat, ppfd);
else
return pfnwglSetPixelFormat (hdc, iPixelFormat, ppfd);
}
int OpenGLGetPixelFormat(HDC hdc)
{
if (!gl_ignore_GDI)
return GetPixelFormat (hdc);
else
return pfnwglGetPixelFormat (hdc);
}
void* Sys_GLGetProc (const char *symbol)
{
return GetProcAddress (gl_module, symbol);
}
void* Sys_GLGetExtension (const char *symbol)
{
return pfnwglGetProcAddress (symbol);
}
bool Sys_GLOpenLibrary (const char* libname)
{
if (libname)
{
gl_module = LoadLibrary (libname);
if (strcmp(libname, "opengl32.dll"))
gl_ignore_GDI = true;
}
if (gl_module == NULL)
{
gl_module = LoadLibrary ("opengl32.dll");
gl_ignore_GDI = false;
}
if (gl_module == NULL)
{
gl_module = LoadLibrary ("opengl.dll");
gl_ignore_GDI = true;
}
if (gl_module == NULL)
return false;
pfnwglChoosePixelFormat = (WGLCHOOSEPIXELFORMAT) Sys_GLGetProc ("wglChoosePixelFormat");
pfnwglDescribePixelFormat = (WGLDESCRIBEPIXELFORMAT) Sys_GLGetProc ("wglDescribePixelFormat");
pfnwglGetPixelFormat = (WGLGETPIXELFORMAT) Sys_GLGetProc ("wglGetPixelFormat");
pfnwglSetPixelFormat = (WGLSETPIXELFORMAT) Sys_GLGetProc ("wglSetPixelFormat");
pfnwglSwapBuffers = (WGLSWAPBUFFERS) Sys_GLGetProc ("wglSwapBuffers");
pfnwglCopyContext = (WGLCOPYCONTEXT) Sys_GLGetProc ("wglCopyContext");
pfnwglCreateContext = (WGLCREATECONTEXT) Sys_GLGetProc ("wglCreateContext");
pfnwglCreateLayerContext = (WGLCREATELAYERCONTEXT) Sys_GLGetProc ("wglCreateLayerContext");
pfnwglDeleteContext = (WGLDELETECONTEXT) Sys_GLGetProc ("wglDeleteContext");
pfnwglGetCurrentContext = (WGLGETCURRENTCONTEXT) Sys_GLGetProc ("wglGetCurrentContext");
pfnwglGetCurrentDC = (WGLGETCURRENTDC) Sys_GLGetProc ("wglGetCurrentDC");
pfnwglGetProcAddress = (WGLGETPROCADDRESS) Sys_GLGetProc ("wglGetProcAddress");
pfnwglMakeCurrent = (WGLMAKECURRENT) Sys_GLGetProc ("wglMakeCurrent");
pfnwglShareLists = (WGLSHARELISTS) Sys_GLGetProc ("wglShareLists");
pfnwglUseFontBitmaps = (WGLUSEFONTBITMAPS) Sys_GLGetProc ("wglUseFontBitmaps");
pfnwglUseFontOutlines = (WGLUSEFONTOUTLINES) Sys_GLGetProc ("wglUseFontOutlines");
pfnwglDescribeLayerPlane = (WGLDESCRIBELAYERPLANE) Sys_GLGetProc ("wglDescribeLayerPlane");
pfnwglSetLayerPaletteEntries = (WGLSETLAYERPALETTEENTRIES) Sys_GLGetProc ("wglSetLayerPaletteEntries");
pfnwglGetLayerPaletteEntries = (WGLGETLAYERPALETTEENTRIES) Sys_GLGetProc ("wglGetLayerPaletteEntries");
pfnwglRealizeLayerPalette = (WGLREALIZELAYERPALETTE) Sys_GLGetProc ("wglRealizeLayerPalette");
pfnwglSwapLayerBuffers = (WGLSWAPLAYERBUFFERS) Sys_GLGetProc ("wglSwapLayerBuffers");
pfnwglSwapIntervalEXT = (WGLSWAPINTERVALEXT) Sys_GLGetProc ("wglSwapIntervalEXT");
pfnwglGetDeviceGammaRampEXT = (WGLGETDEVICEGAMMARAMPEXT) Sys_GLGetProc ("wglGetDeviceGammaRampEXT");
pfnwglSetDeviceGammaRampEXT = (WGLSETDEVICEGAMMARAMPEXT) Sys_GLGetProc ("wglSetDeviceGammaRampEXT");
return true;
}
void Sys_GLCloseLibrary ()
{
if (gl_module)
{
FreeLibrary (gl_module);
gl_module = NULL;
}
pfnwglChoosePixelFormat = NULL;
pfnwglDescribePixelFormat = NULL;
pfnwglGetPixelFormat = NULL;
pfnwglSetPixelFormat = NULL;
pfnwglSwapBuffers = NULL;
pfnwglCopyContext = NULL;
pfnwglCreateContext = NULL;
pfnwglCreateLayerContext = NULL;
pfnwglDeleteContext = NULL;
pfnwglGetCurrentContext = NULL;
pfnwglGetCurrentDC = NULL;
pfnwglGetProcAddress = NULL;
pfnwglMakeCurrent = NULL;
pfnwglShareLists = NULL;
pfnwglUseFontBitmaps = NULL;
pfnwglUseFontOutlines = NULL;
pfnwglDescribeLayerPlane = NULL;
pfnwglSetLayerPaletteEntries = NULL;
pfnwglGetLayerPaletteEntries = NULL;
pfnwglRealizeLayerPalette = NULL;
pfnwglSwapLayerBuffers = NULL;
pfnwglSwapIntervalEXT = NULL;
pfnwglGetDeviceGammaRampEXT = NULL;
pfnwglSetDeviceGammaRampEXT = NULL;
}