⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wgl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: wgl.c,v 1.12 2006/03/30 07:58:24 kschultz Exp $ *//* * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *//* * File name 	: wgl.c * WGL stuff. Added by Oleg Letsinsky, ajl@ultersys.ru * Some things originated from the 3Dfx WGL functions *//*  * This file contains the implementation of the wgl* functions for * Mesa on Windows.  Since these functions are provided by Windows in * GDI/OpenGL, we must supply our versions that work with Mesa here. *//* We're essentially building part of GDI here, so define this so that * we get the right export linkage. */#ifdef __MINGW32__#include <stdarg.h>#include <windef.h>#include <wincon.h>#include <winbase.h>#  if defined(BUILD_GL32)#    define WINGDIAPI __declspec(dllexport)	#  else#    define __W32API_USE_DLLIMPORT__#  endif#include <wingdi.h>#include "GL/mesa_wgl.h"#include <stdlib.h>#else#define _GDI32_#include <windows.h>#endif#include "config.h"#include "glapi.h"#include "GL/wmesa.h"   /* protos for wmesa* functions *//* * Pixel Format Descriptors *//* Extend the PFD to include DB flag */struct __pixelformat__{    PIXELFORMATDESCRIPTOR pfd;    GLboolean doubleBuffered;};/* These are the PFD's supported by this driver. */struct __pixelformat__	pfd[] ={#if 0     /* Double Buffer, alpha */    {		{		    sizeof(PIXELFORMATDESCRIPTOR),	1,	    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|	    PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,	    PFD_TYPE_RGBA,	    24,		    8, 0,		    8, 8,		    8, 16,		    8, 24,	    0, 0, 0, 0, 0,		    DEFAULT_SOFTWARE_DEPTH_BITS,	8,		    0, 0, 0,		    0, 0, 0 	},        GL_TRUE    },    /* Single Buffer, alpha */    {		{		    sizeof(PIXELFORMATDESCRIPTOR),	1,	    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|	    PFD_GENERIC_FORMAT,	    PFD_TYPE_RGBA,	    24,		    8, 0,		    8, 8,		    8, 16,		    8, 24,	    0, 0, 0, 0,	0,		    DEFAULT_SOFTWARE_DEPTH_BITS,	8,		    0, 0, 0,		    0, 0, 0	},        GL_FALSE    },#endif     /* Double Buffer, no alpha */    {		{		    sizeof(PIXELFORMATDESCRIPTOR),	1,	    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|	    PFD_GENERIC_FORMAT|PFD_DOUBLEBUFFER|PFD_SWAP_COPY,	    PFD_TYPE_RGBA,	    24,		    8, 0,	    8, 8,	    8, 16,	    0, 0,	    0, 0, 0, 0,	0,	    DEFAULT_SOFTWARE_DEPTH_BITS,	8,		    0, 0, 0, 	    0, 0, 0 	},        GL_TRUE    },    /* Single Buffer, no alpha */    {		{	    sizeof(PIXELFORMATDESCRIPTOR),	1,	    PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|	    PFD_GENERIC_FORMAT,	    PFD_TYPE_RGBA,	    24,		    8, 0,	    8, 8,	    8, 16,	    0, 0,	    0, 0, 0, 0,	0,	    DEFAULT_SOFTWARE_DEPTH_BITS,	8,		    0, 0, 0,	    0, 0, 0 	},        GL_FALSE    },};int npfd = sizeof(pfd) / sizeof(pfd[0]);/* * Contexts */typedef struct {    WMesaContext ctx;} MesaWglCtx;#define MESAWGL_CTX_MAX_COUNT 20static MesaWglCtx wgl_ctx[MESAWGL_CTX_MAX_COUNT];static unsigned ctx_count = 0;static int ctx_current = -1;static unsigned curPFD = 0;static HDC CurrentHDC = 0;WINGDIAPI HGLRC GLAPIENTRY wglCreateContext(HDC hdc){    int i = 0;    if (!ctx_count) {	for(i=0;i<MESAWGL_CTX_MAX_COUNT;i++) {	    wgl_ctx[i].ctx = NULL;	}    }    for( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {        if ( wgl_ctx[i].ctx == NULL ) {            wgl_ctx[i].ctx = 		WMesaCreateContext(hdc, NULL, (GLboolean)GL_TRUE,				   (GLboolean) (pfd[curPFD-1].doubleBuffered ?                                   GL_TRUE : GL_FALSE), 				   (GLboolean)(pfd[curPFD-1].pfd.cAlphaBits ? 				   GL_TRUE : GL_FALSE) );            if (wgl_ctx[i].ctx == NULL)                break;            ctx_count++;            return ((HGLRC)wgl_ctx[i].ctx);        }    }    SetLastError(0);    return(NULL);}WINGDIAPI BOOL GLAPIENTRY wglDeleteContext(HGLRC hglrc){    int i;    for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {    	if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ){            WMesaMakeCurrent((WMesaContext) hglrc, NULL);            WMesaDestroyContext(wgl_ctx[i].ctx);            wgl_ctx[i].ctx = NULL;            ctx_count--;            return(TRUE);    	}    }    SetLastError(0);    return(FALSE);}WINGDIAPI HGLRC GLAPIENTRY wglGetCurrentContext(VOID){    if (ctx_current < 0)	return 0;    else	return (HGLRC) wgl_ctx[ctx_current].ctx;}WINGDIAPI HDC GLAPIENTRY wglGetCurrentDC(VOID){    return CurrentHDC;}WINGDIAPI BOOL GLAPIENTRY wglMakeCurrent(HDC hdc, HGLRC hglrc){    int i;        CurrentHDC = hdc;    if (!hdc || !hglrc) {	WMesaMakeCurrent(NULL, NULL);	ctx_current = -1;	return TRUE;    }        for ( i = 0; i < MESAWGL_CTX_MAX_COUNT; i++ ) {	if ( wgl_ctx[i].ctx == (WMesaContext) hglrc ) {	    WMesaMakeCurrent( (WMesaContext) hglrc, hdc );	    ctx_current = i;	    return TRUE;	}    }    return FALSE;}WINGDIAPI int GLAPIENTRY wglChoosePixelFormat(HDC hdc,					      CONST 					      PIXELFORMATDESCRIPTOR *ppfd){    int		i,best = -1,bestdelta = 0x7FFFFFFF,delta;    (void) hdc;        if(ppfd->nSize != sizeof(PIXELFORMATDESCRIPTOR) || ppfd->nVersion != 1)	{	    SetLastError(0);	    return(0);	}    for(i = 0; i < npfd;i++)	{	    delta = 0;	    if(		(ppfd->dwFlags & PFD_DRAW_TO_WINDOW) &&		!(pfd[i].pfd.dwFlags & PFD_DRAW_TO_WINDOW))		continue;	    if(		(ppfd->dwFlags & PFD_DRAW_TO_BITMAP) &&		!(pfd[i].pfd.dwFlags & PFD_DRAW_TO_BITMAP))		continue;	    if(		(ppfd->dwFlags & PFD_SUPPORT_GDI) &&		!(pfd[i].pfd.dwFlags & PFD_SUPPORT_GDI))		continue;	    if(		(ppfd->dwFlags & PFD_SUPPORT_OPENGL) &&		!(pfd[i].pfd.dwFlags & PFD_SUPPORT_OPENGL))		continue;	    if(		!(ppfd->dwFlags & PFD_DOUBLEBUFFER_DONTCARE) &&		((ppfd->dwFlags & PFD_DOUBLEBUFFER) != 		 (pfd[i].pfd.dwFlags & PFD_DOUBLEBUFFER)))		continue;	    if(		!(ppfd->dwFlags & PFD_STEREO_DONTCARE) &&		((ppfd->dwFlags & PFD_STEREO) != 		 (pfd[i].pfd.dwFlags & PFD_STEREO)))		continue;	    if(ppfd->iPixelType != pfd[i].pfd.iPixelType)		delta++;	    if(ppfd->cAlphaBits != pfd[i].pfd.cAlphaBits)		delta++;	    if(delta < bestdelta)		{		    best = i + 1;		    bestdelta = delta;		    if(bestdelta == 0)			break;		}	}    if(best == -1)	{	    SetLastError(0);	    return(0);	}    return(best);}WINGDIAPI int GLAPIENTRY wglDescribePixelFormat(HDC hdc,					        int iPixelFormat,					        UINT nBytes,					        LPPIXELFORMATDESCRIPTOR ppfd){    (void) hdc;        if(ppfd == NULL)	return(npfd);    if(iPixelFormat < 1 || iPixelFormat > npfd ||        nBytes != sizeof(PIXELFORMATDESCRIPTOR))	{	    SetLastError(0);	    return(0);	}    *ppfd = pfd[iPixelFormat - 1].pfd;    return(npfd);}WINGDIAPI PROC GLAPIENTRY wglGetProcAddress(LPCSTR lpszProc){    PROC p = (PROC) _glapi_get_proc_address((const char *) lpszProc);    if (p)	return p;        SetLastError(0);    return(NULL);}WINGDIAPI int GLAPIENTRY wglGetPixelFormat(HDC hdc){    (void) hdc;    if(curPFD == 0) {	SetLastError(0);	return(0);    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -