1 /* $Id: wgl.c,v 1.4 2000/11/22 08:55:53 joukj Exp $ */
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the Free
16 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * WGL stuff. Added by Oleg Letsinsky, ajl@ultersys.ru
23 * Some things originated from the 3Dfx WGL functions
33 #define GL_GLEXT_PROTOTYPES
48 #define MAX_MESA_ATTRS 20
56 struct __pixelformat__
58 PIXELFORMATDESCRIPTOR pfd
;
59 GLboolean doubleBuffered
;
62 struct __extensions__ ext
[] = {
64 #ifdef GL_EXT_polygon_offset
65 { (PROC
)glPolygonOffsetEXT
, "glPolygonOffsetEXT" },
67 { (PROC
)glBlendEquationEXT
, "glBlendEquationEXT" },
68 { (PROC
)glBlendColorEXT
, "glBlendColorExt" },
69 { (PROC
)glVertexPointerEXT
, "glVertexPointerEXT" },
70 { (PROC
)glNormalPointerEXT
, "glNormalPointerEXT" },
71 { (PROC
)glColorPointerEXT
, "glColorPointerEXT" },
72 { (PROC
)glIndexPointerEXT
, "glIndexPointerEXT" },
73 { (PROC
)glTexCoordPointerEXT
, "glTexCoordPointer" },
74 { (PROC
)glEdgeFlagPointerEXT
, "glEdgeFlagPointerEXT" },
75 { (PROC
)glGetPointervEXT
, "glGetPointervEXT" },
76 { (PROC
)glArrayElementEXT
, "glArrayElementEXT" },
77 { (PROC
)glDrawArraysEXT
, "glDrawArrayEXT" },
78 { (PROC
)glAreTexturesResidentEXT
, "glAreTexturesResidentEXT" },
79 { (PROC
)glBindTextureEXT
, "glBindTextureEXT" },
80 { (PROC
)glDeleteTexturesEXT
, "glDeleteTexturesEXT" },
81 { (PROC
)glGenTexturesEXT
, "glGenTexturesEXT" },
82 { (PROC
)glIsTextureEXT
, "glIsTextureEXT" },
83 { (PROC
)glPrioritizeTexturesEXT
, "glPrioritizeTexturesEXT" },
84 { (PROC
)glCopyTexSubImage3DEXT
, "glCopyTexSubImage3DEXT" },
85 { (PROC
)glTexImage3DEXT
, "glTexImage3DEXT" },
86 { (PROC
)glTexSubImage3DEXT
, "glTexSubImage3DEXT" },
87 { (PROC
)glColorTableEXT
, "glColorTableEXT" },
88 { (PROC
)glColorSubTableEXT
, "glColorSubTableEXT" },
89 { (PROC
)glGetColorTableEXT
, "glGetColorTableEXT" },
90 { (PROC
)glGetColorTableParameterfvEXT
, "glGetColorTableParameterfvEXT" },
91 { (PROC
)glGetColorTableParameterivEXT
, "glGetColorTableParameterivEXT" },
92 { (PROC
)glPointParameterfEXT
, "glPointParameterfEXT" },
93 { (PROC
)glPointParameterfvEXT
, "glPointParameterfvEXT" },
94 { (PROC
)glBlendFuncSeparateEXT
, "glBlendFuncSeparateEXT" },
95 { (PROC
)glLockArraysEXT
, "glLockArraysEXT" },
96 { (PROC
)glUnlockArraysEXT
, "glUnlockArraysEXT" }
99 int qt_ext
= sizeof(ext
) / sizeof(ext
[0]);
101 struct __pixelformat__ pix
[] =
103 { { sizeof(PIXELFORMATDESCRIPTOR
), 1,
104 PFD_DRAW_TO_WINDOW
|PFD_SUPPORT_OPENGL
|PFD_GENERIC_FORMAT
|PFD_DOUBLEBUFFER
|PFD_SWAP_COPY
,
106 24, 8, 0, 8, 8, 8, 16, 8, 24,
107 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
110 { { sizeof(PIXELFORMATDESCRIPTOR
), 1,
111 PFD_DRAW_TO_WINDOW
|PFD_SUPPORT_OPENGL
|PFD_GENERIC_FORMAT
,
113 24, 8, 0, 8, 8, 8, 16, 8, 24,
114 0, 0, 0, 0, 0, 16, 8, 0, 0, 0, 0, 0, 0 },
119 int qt_pix
= sizeof(pix
) / sizeof(pix
[0]);
126 #define MESAWGL_CTX_MAX_COUNT 20
128 static MesaWglCtx wgl_ctx
[MESAWGL_CTX_MAX_COUNT
];
130 static unsigned ctx_count
= 0;
131 static unsigned ctx_current
= -1;
132 static unsigned curPFD
= 0;
134 GLAPI BOOL GLWINAPI
wglCopyContext(HGLRC hglrcSrc
,HGLRC hglrcDst
,UINT mask
)
139 GLAPI HGLRC GLWINAPI
wglCreateContext(HDC hdc
)
143 if(!(hWnd
= WindowFromDC(hdc
)))
150 for(i
=0;i
<MESAWGL_CTX_MAX_COUNT
;i
++)
152 wgl_ctx
[i
].ctx
= NULL
;
153 wgl_ctx
[i
].hdc
= NULL
;
156 for( i
= 0; i
< MESAWGL_CTX_MAX_COUNT
; i
++ )
158 if ( wgl_ctx
[i
].ctx
== NULL
)
160 wgl_ctx
[i
].ctx
= WMesaCreateContext( hWnd
, NULL
, GL_TRUE
,
161 pix
[curPFD
-1].doubleBuffered
);
162 if (wgl_ctx
[i
].ctx
== NULL
)
164 wgl_ctx
[i
].hdc
= hdc
;
166 return ((HGLRC
)wgl_ctx
[i
].ctx
);
173 GLAPI BOOL GLWINAPI
wglDeleteContext(HGLRC hglrc
)
176 for ( i
= 0; i
< MESAWGL_CTX_MAX_COUNT
; i
++ )
178 if ( wgl_ctx
[i
].ctx
== (PWMC
) hglrc
)
180 WMesaMakeCurrent((PWMC
) hglrc
);
181 WMesaDestroyContext();
182 wgl_ctx
[i
].ctx
= NULL
;
183 wgl_ctx
[i
].hdc
= NULL
;
192 GLAPI HGLRC GLWINAPI
wglCreateLayerContext(HDC hdc
,int iLayerPlane
)
198 GLAPI HGLRC GLWINAPI
wglGetCurrentContext(VOID
)
203 return (HGLRC
) wgl_ctx
[ctx_current
].ctx
;
206 GLAPI HDC GLWINAPI
wglGetCurrentDC(VOID
)
211 return wgl_ctx
[ctx_current
].hdc
;
214 GLAPI BOOL GLWINAPI
wglMakeCurrent(HDC hdc
,HGLRC hglrc
)
218 /* new code suggested by Andy Sy */
219 if (!hdc
|| !hglrc
) {
220 WMesaMakeCurrent(NULL
);
225 for ( i
= 0; i
< MESAWGL_CTX_MAX_COUNT
; i
++ )
227 if ( wgl_ctx
[i
].ctx
== (PWMC
) hglrc
)
229 wgl_ctx
[i
].hdc
= hdc
;
230 WMesaMakeCurrent( (WMesaContext
) hglrc
);
238 GLAPI BOOL GLWINAPI
wglShareLists(HGLRC hglrc1
,HGLRC hglrc2
)
244 static FIXED
FixedFromDouble(double d
)
246 long l
= (long) (d
* 65536L);
251 GLAPI BOOL GLWINAPI
wglUseFontBitmapsA(HDC hdc
, DWORD first
,
252 DWORD count
, DWORD listBase
)
269 font_list
= glGenLists( count
);
273 mat
.eM11
= FixedFromDouble(1);
274 mat
.eM12
= FixedFromDouble(0);
275 mat
.eM21
= FixedFromDouble(0);
276 mat
.eM22
= FixedFromDouble(1);
278 memset(&gm
,0,sizeof(gm
));
280 for (i
= 0; i
< count
; i
++)
282 glNewList( font_list
+i
, GL_COMPILE
);
284 /* allocate space for the bitmap/outline */
285 size
= GetGlyphOutline(hdc
, first
+ i
, GGO_BITMAP
, &gm
, 0, NULL
, &mat
);
286 if (size
== GDI_ERROR
)
289 err
= GetLastError();
293 hBits
= GlobalAlloc(GHND
, size
);
294 lpBits
= GlobalLock(hBits
);
296 GetGlyphOutline(hdc
, /* handle to device context */
297 first
+ i
, /* character to query */
298 GGO_BITMAP
, /* format of data to return */
299 &gm
, /* pointer to structure for metrics */
300 size
, /* size of buffer for data */
301 lpBits
, /* pointer to buffer for data */
302 &mat
/* pointer to transformation */
303 /* matrix structure */
306 if (*lpBits
== GDI_ERROR
)
309 err
= GetLastError();
317 glBitmap(gm
.gmBlackBoxX
,gm
.gmBlackBoxY
,
318 gm
.gmptGlyphOrigin
.x
,
319 gm
.gmptGlyphOrigin
.y
,
320 gm
.gmCellIncX
,gm
.gmCellIncY
,
321 (const GLubyte
* )lpBits
);
332 GLAPI BOOL GLWINAPI
wglUseFontBitmapsW(HDC hdc
,DWORD first
,DWORD count
,DWORD listBase
)
337 GLAPI BOOL GLWINAPI
wglUseFontOutlinesA(HDC hdc
,DWORD first
,DWORD count
,
338 DWORD listBase
,FLOAT deviation
,
339 FLOAT extrusion
,int format
,
340 LPGLYPHMETRICSFLOAT lpgmf
)
346 GLAPI BOOL GLWINAPI
wglUseFontOutlinesW(HDC hdc
,DWORD first
,DWORD count
,
347 DWORD listBase
,FLOAT deviation
,
348 FLOAT extrusion
,int format
,
349 LPGLYPHMETRICSFLOAT lpgmf
)
355 GLAPI BOOL GLWINAPI
wglDescribeLayerPlane(HDC hdc
,int iPixelFormat
,
356 int iLayerPlane
,UINT nBytes
,
357 LPLAYERPLANEDESCRIPTOR plpd
)
363 GLAPI
int GLWINAPI
wglSetLayerPaletteEntries(HDC hdc
,int iLayerPlane
,
364 int iStart
,int cEntries
,
371 GLAPI
int GLWINAPI
wglGetLayerPaletteEntries(HDC hdc
,int iLayerPlane
,
372 int iStart
,int cEntries
,
379 GLAPI BOOL GLWINAPI
wglRealizeLayerPalette(HDC hdc
,int iLayerPlane
,BOOL bRealize
)
385 GLAPI BOOL GLWINAPI
wglSwapLayerBuffers(HDC hdc
,UINT fuPlanes
)
396 GLAPI
int GLWINAPI
wglChoosePixelFormat(HDC hdc
,
397 CONST PIXELFORMATDESCRIPTOR
*ppfd
)
399 int i
,best
= -1,bestdelta
= 0x7FFFFFFF,delta
,qt_valid_pix
;
401 qt_valid_pix
= qt_pix
;
402 if(ppfd
->nSize
!= sizeof(PIXELFORMATDESCRIPTOR
) || ppfd
->nVersion
!= 1)
407 for(i
= 0;i
< qt_valid_pix
;i
++)
411 (ppfd
->dwFlags
& PFD_DRAW_TO_WINDOW
) &&
412 !(pix
[i
].pfd
.dwFlags
& PFD_DRAW_TO_WINDOW
))
415 (ppfd
->dwFlags
& PFD_DRAW_TO_BITMAP
) &&
416 !(pix
[i
].pfd
.dwFlags
& PFD_DRAW_TO_BITMAP
))
419 (ppfd
->dwFlags
& PFD_SUPPORT_GDI
) &&
420 !(pix
[i
].pfd
.dwFlags
& PFD_SUPPORT_GDI
))
423 (ppfd
->dwFlags
& PFD_SUPPORT_OPENGL
) &&
424 !(pix
[i
].pfd
.dwFlags
& PFD_SUPPORT_OPENGL
))
427 !(ppfd
->dwFlags
& PFD_DOUBLEBUFFER_DONTCARE
) &&
428 ((ppfd
->dwFlags
& PFD_DOUBLEBUFFER
) != (pix
[i
].pfd
.dwFlags
& PFD_DOUBLEBUFFER
)))
431 !(ppfd
->dwFlags
& PFD_STEREO_DONTCARE
) &&
432 ((ppfd
->dwFlags
& PFD_STEREO
) != (pix
[i
].pfd
.dwFlags
& PFD_STEREO
)))
434 if(ppfd
->iPixelType
!= pix
[i
].pfd
.iPixelType
)
436 if(delta
< bestdelta
)
452 GLAPI
int GLWINAPI
wglDescribePixelFormat(HDC hdc
,int iPixelFormat
,UINT nBytes
,
453 LPPIXELFORMATDESCRIPTOR ppfd
)
457 qt_valid_pix
= qt_pix
;
458 if(iPixelFormat
< 1 || iPixelFormat
> qt_valid_pix
|| nBytes
!= sizeof(PIXELFORMATDESCRIPTOR
))
463 *ppfd
= pix
[iPixelFormat
- 1].pfd
;
464 return(qt_valid_pix
);
468 * GetProcAddress - return the address of an appropriate extension
470 GLAPI PROC GLWINAPI
wglGetProcAddress(LPCSTR lpszProc
)
473 for(i
= 0;i
< qt_ext
;i
++)
474 if(!strcmp(lpszProc
,ext
[i
].name
))
481 GLAPI
int GLWINAPI
wglGetPixelFormat(HDC hdc
)
491 GLAPI BOOL GLWINAPI
wglSetPixelFormat(HDC hdc
,int iPixelFormat
,
492 PIXELFORMATDESCRIPTOR
*ppfd
)
496 qt_valid_pix
= qt_pix
;
497 if(iPixelFormat
< 1 || iPixelFormat
> qt_valid_pix
|| ppfd
->nSize
!= sizeof(PIXELFORMATDESCRIPTOR
))
502 curPFD
= iPixelFormat
;
506 GLAPI BOOL GLWINAPI
wglSwapBuffers(HDC hdc
)
511 if(wgl_ctx
[ctx_current
].ctx
== NULL
) {