1 /*----------------------------------------------------------------------------
2 
3 gls.c - This file contains the function and variable definitions for the
4     GLSetup dynamic OpenGL driver linking.  Applications can load the
5     standard opengl32.dll or any other standalone driver that obeys the
6     linking protocol.
7 
8     See gls.h or http://www.glsetup.com/dev/gls.htm for more information
9     and to report bugs.
10 
11     Copyright 1999 GLSetup Incorporated, All Rights Reserved.
12 
13     You have permission to use this code in your applications, commercial
14     or otherwise.  If you distribute source code with your application,
15     this file must not be modified.  Please don't mirror these files;
16     instead, link to the URL above.
17 
18     Version 1.0.0.2 Beta
19     Created 7-24-99
20 
21 */
22 
23 #ifndef WIN32_LEAN_AND_MEAN
24 #define WIN32_LEAN_AND_MEAN
25 #endif
26 #ifndef WIN32_EXTRA_LEAN
27 #define WIN32_EXTRA_LEAN
28 #endif
29 #include <windows.h>
30 #include <assert.h>
31 #include <string.h>
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include "gls.h"
35 #include "glsu.h"
36 
37 /*----------------------------------------------------------------------------
38 
39 File-scope variables and internal function declarations.
40 
41 NOTE:  The gl function pointers are defined at the bottom of the file.
42 
43 */
44 
45 #ifdef NDEBUG
46 #define GLS_STATIC static
47 #else
48 #define GLS_STATIC
49 #endif
50 
51 GLS_STATIC DWORD _glsBehavior = 0;
52 
53 GLS_STATIC HMODULE _glsGLDriverHandle, _glsGLUDriverHandle, _glsGDI32;
54 #define GLS_INVALID_DRIVER_INDEX 0xFFFFFFFF
55 GLS_STATIC int unsigned _glsLoadedDriverIndex = GLS_INVALID_DRIVER_INDEX;
56 GLS_STATIC char _glsGLDriverFilePath[MAX_PATH], _glsGLUDriverFilePath[MAX_PATH];
57 GLS_STATIC gls_driver_info _glsDriverInfos[3];
58 GLS_STATIC int unsigned _glsNumberOfDriverInfos = 0;
59 
_glsDebugBreakFunction(void)60 GLS_STATIC void __stdcall _glsDebugBreakFunction( void )
61 {
62     DebugBreak();
63 }
64 
65 GLS_STATIC BOOL _glsRead3dfxSplashEnv = FALSE;
66 #define _GLS_3DFX_SPLASH_STRING "FX_GLIDE_NO_SPLASH"
67 #define _GLS_3DFX_SPLASH_OFF "1"
68 GLS_STATIC char const *_gls3dfxSplashEnv = 0;
69 
70 GLS_STATIC BOOL _glsReadSGIRegistryEntry = FALSE;
71 #define _GLS_SGI_REGISTRY_ROOT HKEY_LOCAL_MACHINE
72 #define _GLS_SGI_REGISTRY_KEY "Software\\Silicon Graphics\\OpenGL"
73 #define _GLS_SGI_REGISTRY_VALUE "OverrideDispatch"
74 #define _GLS_SGI_REGISTRY_DEFAULT 0
75 #define _GLS_SGI_REGISTRY_OFF 1
76 GLS_STATIC DWORD _glsSGIRegistryEntry = 0;
77 
78 /* on error utility functions clear the values they're supposed to set */
79 
80 GLS_STATIC BOOL _glsGetDriverFileDate( char const *pDriverFilePath,
81                                        gls_driver_file_info *pDriverFileInfo );
82 
83 GLS_STATIC BOOL _glsGetDriverFileVersion( char const *pDriverFilePath,
84                                           gls_driver_file_info *pDriverFileInfo,
85                                           char *pDescription,
86                                           int unsigned DescriptionLength );
87 
88 GLS_STATIC BOOL _glsCopyPathCheckSystemDirectory(
89     char const *pDriverFilePath, gls_driver_file_info *pDriverFileInfo,
90         BOOL *pIsInSystemDir );
91 
92 GLS_STATIC char const *_glsGetVersionString( BYTE const *pVersionInfo,
93                                              char const *pVersionString,
94                                              UINT *pStringSize );
95 
96 GLS_STATIC BOOL _glsIsDefaultOpenGL( char const *pGLDriverFilePath );
97 GLS_STATIC BOOL _glsCompareDirectories( char const *pA, char const *pB );
98 
99 GLS_STATIC char const *_glsGetEnv( char const *pEnv );
100 GLS_STATIC void _glsSetEnv( char const *pEnv, char const *pValue );
101 GLS_STATIC DWORD _glsGetRegistryDWORD( HKEY Root, char const *pKey,
102                                        char const *pValue, DWORD Default );
103 GLS_STATIC void _glsSetRegistryDWORD( HKEY Root, char const *pKey,
104                                       char const *pValue, DWORD Value );
105 
106 /* this function will copy a string and null-terminate the dest safely */
_safe_strncpy(char * pDest,char const * pSource,int unsigned Length)107 GLS_STATIC void _safe_strncpy( char *pDest, char const *pSource,
108                                int unsigned Length )
109 {
110     while(Length && ((*pDest++ = *pSource++) != 0))
111     {
112         Length--;
113     }
114     if(!Length)
115     {
116         *(pDest-1) = 0;
117     }
118 }
119 
120 /*----------------------------------------------------------------------------
121 
122 gls[Get|Set]Behavior - These functions change the default behavior of the
123     gls library.
124 
125 */
126 
glsGetBehavior(void)127 DWORD glsGetBehavior( void )
128 {
129     return _glsBehavior;
130 }
131 
glsSetBehavior(DWORD NewBehavior)132 extern DWORD glsSetBehavior( DWORD NewBehavior )
133 {
134     DWORD OldBehavior = _glsBehavior;
135     _glsBehavior = NewBehavior;
136 
137     if(NewBehavior & GLS_BEHAVIOR_INVALID_FUNCTIONS_DEBUGBREAK)
138     {
139         glsUnloadDriver();  /* initialize the invalid functions */
140     }
141     return OldBehavior;
142 }
143 
144 /*----------------------------------------------------------------------------
145 
146 glsGetNumberOfDrivers - This function figures out how many installed OpenGL
147     drivers are present in the system.
148 
149 @todo this hoses if there was ever a 3dfxvgl.dll in the system...
150 
151 */
152 
glsGetNumberOfDrivers(void)153 int unsigned glsGetNumberOfDrivers( void )
154 {
155     char aGLPath[MAX_PATH];
156     char aGLUPath[MAX_PATH];
157     static struct local_driver_info
158     {
159         DWORD AdditionalFlags;
160         char aGLDriverFileName[MAX_PATH];
161         char aGLUDriverFileName[MAX_PATH];
162         char aDriverDescription[sizeof(_glsDriverInfos[0].aDriverDescription)];
163     } aDrivers[] =
164       {
165           { GLS_FLAGS_DEFAULT_OPENGL_DRIVER,    /* this is set redundantly */
166             "\\opengl32.dll",
167             "\\glu32.dll",
168             "Default OpenGL Driver" },
169           { GLS_FLAGS_FULLSCREEN_ONLY | GLS_FLAGS_STANDALONE_DRIVER,
170             "\\3dfxvgl.dll",
171             "\\3dfxvglu.dll",
172             "3dfx Standalone OpenGL Driver" },
173           { GLS_FLAGS_SOFTWARE_ONLY,
174             "\\opengl.dll",
175             "\\glu.dll",
176             "SGI Software OpenGL Driver" }
177       };
178 #define NUMBER_OF_DRIVERS (sizeof(aDrivers)/sizeof(aDrivers[0]))
179 #define NUMBER_OF_DRIVERINFOS (sizeof(_glsDriverInfos)/sizeof(_glsDriverInfos[0]))
180 
181     _glsNumberOfDriverInfos = 0;
182 
183     if(GetSystemDirectory(aGLPath,sizeof(aGLPath)))
184     {
185         int GLFileLength, GLUFileLength;
186         int const SystemLength = (int) strlen(aGLPath);
187         int unsigned DriverIndex;
188         _safe_strncpy(aGLUPath,aGLPath,sizeof(aGLUPath));
189 
190         for(DriverIndex = 0;
191             (DriverIndex < NUMBER_OF_DRIVERS)
192                 && (_glsNumberOfDriverInfos < NUMBER_OF_DRIVERINFOS);
193             DriverIndex++)
194         {
195             GLFileLength = (int) strlen(aDrivers[DriverIndex].aGLDriverFileName);
196             GLUFileLength = (int) strlen(aDrivers[DriverIndex].aGLUDriverFileName);
197 
198             /* this requires GLUs to be listed in the struct above */
199 
200             if((sizeof(aGLPath) > (GLFileLength + SystemLength))
201                && (sizeof(aGLUPath) > (GLUFileLength + SystemLength)))
202             {
203                 _safe_strncpy(aGLPath+SystemLength,
204                               aDrivers[DriverIndex].aGLDriverFileName,
205                               sizeof(aGLPath) - SystemLength);
206                 _safe_strncpy(aGLUPath+SystemLength,
207                               aDrivers[DriverIndex].aGLUDriverFileName,
208                               sizeof(aGLUPath) - SystemLength);
209 
210                 if(GLS_ERROR_OK == glsGetDriverInfoFromFilePath(
211                     aGLPath,aGLUPath,&_glsDriverInfos[_glsNumberOfDriverInfos]))
212                 {
213                     _glsDriverInfos[_glsNumberOfDriverInfos].DriverFlags &=
214                         ~GLS_FLAGS_DRIVER_UNKNOWN_FEATURES;
215                     _glsDriverInfos[_glsNumberOfDriverInfos].DriverFlags |=
216                         aDrivers[DriverIndex].AdditionalFlags;
217 
218                     assert(sizeof(aDrivers[DriverIndex].aDriverDescription) ==
219                            sizeof(_glsDriverInfos[0].aDriverDescription));
220 
221                     if(aDrivers[DriverIndex].aDriverDescription[0])
222                     {
223                         _safe_strncpy(
224                             _glsDriverInfos[_glsNumberOfDriverInfos].
225                                 aDriverDescription,
226                                 aDrivers[DriverIndex].aDriverDescription,
227                                 sizeof(_glsDriverInfos[0].aDriverDescription));
228                     }
229 
230                     _glsNumberOfDriverInfos++;
231                 }
232             }
233         }
234     }
235 #undef NUMBER_OF_DRIVERS
236 #undef NUMBER_OF_DRIVERINFOS
237 
238     return _glsNumberOfDriverInfos;
239 }
240 
241 /*----------------------------------------------------------------------------
242 
243 glsIsDriverLoaded - This function returns TRUE if a driver is loaded,
244     FALSE otherwise.
245 
246 */
247 
glsIsDriverLoaded(void)248 BOOL glsIsDriverLoaded( void )
249 {
250     return _glsGLDriverHandle != 0;
251 }
252 
253 /*----------------------------------------------------------------------------
254 
255 glsGetDriverInfo - This function returns the gls_driver_info for the indexed
256     OpenGL driver.
257 
258 */
259 
glsGetDriverInfo(int unsigned DriverInfoIndex,gls_driver_info * pDriverInfo)260 gls_error glsGetDriverInfo( int unsigned DriverInfoIndex,
261                             gls_driver_info *pDriverInfo )
262 {
263     gls_error ErrorCode = GLS_ERROR_INVALID_PARAMETERS;
264 
265     /* if we haven't been initialized, do it now */
266     if(!_glsNumberOfDriverInfos)
267     {
268         glsGetNumberOfDrivers();
269     }
270 
271     if(pDriverInfo && (DriverInfoIndex < _glsNumberOfDriverInfos))
272     {
273         ErrorCode = GLS_ERROR_OK;
274         *pDriverInfo = _glsDriverInfos[DriverInfoIndex];
275     }
276 
277     return ErrorCode;
278 }
279 
280 /*----------------------------------------------------------------------------
281 
282 glsGetCurrentDriverInfo - This function returns the gls_driver_info for the
283     currently loaded OpenGL driver.
284 
285 */
286 
glsGetCurrentDriverInfo(gls_driver_info * pDriverInfo)287 gls_error glsGetCurrentDriverInfo( gls_driver_info *pDriverInfo )
288 {
289     gls_error ErrorCode = GLS_ERROR_NO_DRIVER_LOADED;
290 
291     if(pDriverInfo && _glsGLDriverHandle)
292     {
293         if(_glsLoadedDriverIndex == GLS_INVALID_DRIVER_INDEX)
294         {
295             /* we were loaded from a file path */
296             assert(_glsGLDriverFilePath[0]);
297             ErrorCode = glsGetDriverInfoFromFilePath(_glsGLDriverFilePath,
298                                                      _glsGLUDriverFilePath,
299                                                      pDriverInfo);
300         }
301         else
302         {
303             /* we were loaded from an index */
304             assert(_glsLoadedDriverIndex < _glsNumberOfDriverInfos);
305             ErrorCode = glsGetDriverInfo(_glsLoadedDriverIndex,pDriverInfo);
306         }
307     }
308 
309     return ErrorCode;
310 }
311 
312 /*----------------------------------------------------------------------------
313 
314 glsGetCurrentDriverFlags - This function returns the driver flags from the
315     currently loaded driver.
316 
317 */
318 
glsGetCurrentDriverFlags(void)319 DWORD glsGetCurrentDriverFlags( void )
320 {
321     DWORD Flags = (DWORD)(GLS_FLAGS_DRIVER_UNKNOWN_FEATURES
322                           | GLS_FLAGS_NO_GL_VERSION_INFO
323                           | GLS_FLAGS_NO_GLU
324                           | GLS_FLAGS_NO_GLU_VERSION_INFO);
325 
326     gls_driver_info DriverInfo;
327 
328     if(glsGetCurrentDriverInfo(&DriverInfo) == GLS_ERROR_OK)
329     {
330         Flags = DriverInfo.DriverFlags;
331     }
332     return Flags;
333 }
334 
335 /*----------------------------------------------------------------------------
336 
337 glsGetDriverInfoFromFilePath - Get the gls_driver_info using a path to the
338     driver.
339 
340 @todo need more error reporting here
341 
342 */
343 
glsGetDriverInfoFromFilePath(char const * pGLDriverFilePath,char const * pGLUDriverFilePath,gls_driver_info * pDriverInfo)344 gls_error glsGetDriverInfoFromFilePath( char const *pGLDriverFilePath,
345                                         char const *pGLUDriverFilePath,
346                                         gls_driver_info *pDriverInfo )
347 {
348     gls_error ErrorCode = GLS_ERROR_INVALID_PARAMETERS;
349 
350     /* check parms and get the file date */
351     if(pGLDriverFilePath && pDriverInfo
352        && _glsGetDriverFileDate(pGLDriverFilePath,&pDriverInfo->GLDriver))
353     {
354         BOOL GLUSuccessful = FALSE;
355         BOOL GLUIsInSystemDir = FALSE;
356         BOOL GLIsInSystemDir = FALSE;
357 
358         /* clear the flags out...cast to avoid warning on W4 */
359         pDriverInfo->DriverFlags = (DWORD)GLS_FLAGS_DRIVER_UNKNOWN_FEATURES;
360 
361         /* take care of the GLU first and get it out of the way */
362 
363         if(pGLUDriverFilePath && pGLUDriverFilePath[0] &&
364            !(_glsBehavior & GLS_BEHAVIOR_NEVER_LOAD_GLU))
365         {
366             if(_glsGetDriverFileDate(pGLUDriverFilePath,
367                                      &pDriverInfo->GLUDriver))
368             {
369                 if(!_glsGetDriverFileVersion(pGLUDriverFilePath,
370                                              &pDriverInfo->GLUDriver,0,0))
371                 {
372                     pDriverInfo->DriverFlags |= GLS_FLAGS_NO_GLU_VERSION_INFO;
373                 }
374 
375                 if(_glsCopyPathCheckSystemDirectory(pGLUDriverFilePath,
376                                                     &pDriverInfo->GLUDriver,
377                                                     &GLUIsInSystemDir))
378                 {
379                     GLUSuccessful = TRUE;
380                 }
381             }
382         }
383 
384         if(!GLUSuccessful)
385         {
386             /* either there was no GLU requested, or we couldn't find it */
387             GLUSuccessful = TRUE;
388             pDriverInfo->GLUDriver.aDriverFilePath[0] = 0;
389             pDriverInfo->DriverFlags |=
390                 (GLS_FLAGS_NO_GLU | GLS_FLAGS_NO_GLU_VERSION_INFO);
391         }
392 
393         /* do the GL driver now */
394 
395         /* get the version number and description */
396         if(!_glsGetDriverFileVersion(pGLDriverFilePath,
397                                      &pDriverInfo->GLDriver,
398                                      pDriverInfo->aDriverDescription,
399                                      sizeof(pDriverInfo->aDriverDescription)))
400         {
401             char const *pUnknownDescription = "Unknown";
402             assert(sizeof(pDriverInfo->aDriverDescription) >
403                    strlen(pUnknownDescription));
404 
405             _safe_strncpy(pDriverInfo->aDriverDescription,pUnknownDescription,
406                           sizeof(pDriverInfo->aDriverDescription));
407 
408             pDriverInfo->DriverFlags |= GLS_FLAGS_NO_GL_VERSION_INFO;
409         }
410 
411         /* get the file path and the systemdir flag */
412         if(_glsCopyPathCheckSystemDirectory(pGLDriverFilePath,
413                                             &pDriverInfo->GLDriver,
414                                             &GLIsInSystemDir))
415         {
416             if(GLIsInSystemDir)
417             {
418                 pDriverInfo->DriverFlags |= GLS_FLAGS_DRIVER_IN_SYSTEM_DIR;
419             }
420             if(_glsIsDefaultOpenGL(pDriverInfo->GLDriver.aDriverFilePath))
421             {
422                 pDriverInfo->DriverFlags |= GLS_FLAGS_DEFAULT_OPENGL_DRIVER;
423             }
424 
425             /* now check if GLU and GL are in the same directory and if not
426                disable the GLU */
427 
428             if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_GLU_IN_DIFFERENT_DIR)
429                && GLUSuccessful
430                && !_glsCompareDirectories(pDriverInfo->GLDriver.aDriverFilePath,
431                                           pDriverInfo->GLUDriver.aDriverFilePath))
432             {
433                 /* okay, they're in different directories, fail GLU */
434                 pDriverInfo->GLUDriver.aDriverFilePath[0] = 0;
435                 pDriverInfo->DriverFlags |=
436                     (GLS_FLAGS_NO_GLU | GLS_FLAGS_NO_GLU_VERSION_INFO);
437             }
438 
439             ErrorCode = GLS_ERROR_OK;
440         }
441     }
442     return ErrorCode;
443 }
444 
445 /*----------------------------------------------------------------------------
446 
447 glsLoadDriver - This function loads the indexed OpenGL driver and dynalinks
448     the function pointers.
449 
450 */
451 
glsLoadDriver(int unsigned DriverInfoIndex)452 gls_error glsLoadDriver( int unsigned DriverInfoIndex )
453 {
454     gls_error ErrorCode = GLS_ERROR_INVALID_PARAMETERS;
455 
456     /* if we haven't been initialized, do it now */
457     if(!_glsNumberOfDriverInfos)
458     {
459         glsGetNumberOfDrivers();
460     }
461 
462     if(DriverInfoIndex < _glsNumberOfDriverInfos)
463     {
464         ErrorCode = glsLoadDriverFromFilePath(
465             _glsDriverInfos[DriverInfoIndex].GLDriver.aDriverFilePath,
466                 _glsDriverInfos[DriverInfoIndex].GLUDriver.aDriverFilePath);
467 
468         if(ErrorCode == GLS_ERROR_OK)
469         {
470             _glsLoadedDriverIndex = DriverInfoIndex;
471         }
472     }
473 
474     return ErrorCode;
475 }
476 
477 
478 /*----------------------------------------------------------------------------
479 
480 glsLoadDriverFromFilePath - This function loads the named OpenGL driver
481     and dynalinks the function pointers.
482 
483 */
484 
glsLoadDriverFromFilePath(char const * pGLDriverFilePath,char const * pGLUDriverFilePath)485 gls_error glsLoadDriverFromFilePath( char const *pGLDriverFilePath,
486                                      char const *pGLUDriverFilePath )
487 {
488     gls_error ErrorCode = GLS_ERROR_DRIVER_LOAD_FAILED;
489 
490     /* this has to come first because it will undo everything below */
491     glsUnloadDriver();
492 
493     if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_GRATUITOUS_HYPE_SCREENS))
494     {
495         /* get rid of the annoying 3dfx hype splash screen */
496         if(!_glsRead3dfxSplashEnv)
497         {
498             _gls3dfxSplashEnv = _glsGetEnv(_GLS_3DFX_SPLASH_STRING);
499             _glsRead3dfxSplashEnv = TRUE;
500         }
501         _glsSetEnv(_GLS_3DFX_SPLASH_STRING,_GLS_3DFX_SPLASH_OFF);
502     }
503 
504     if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_SOFTWARE_REVECTORING))
505     {
506         /* don't let the SGI opengl vector to opengl32.dll */
507         if(!_glsReadSGIRegistryEntry)
508         {
509             _glsSGIRegistryEntry = _glsGetRegistryDWORD(_GLS_SGI_REGISTRY_ROOT,
510                                                         _GLS_SGI_REGISTRY_KEY,
511                                                         _GLS_SGI_REGISTRY_VALUE,
512                                                         _GLS_SGI_REGISTRY_DEFAULT);
513 
514             _glsReadSGIRegistryEntry = TRUE;
515         }
516         _glsSetRegistryDWORD(_GLS_SGI_REGISTRY_ROOT,_GLS_SGI_REGISTRY_KEY,
517                              _GLS_SGI_REGISTRY_VALUE,_GLS_SGI_REGISTRY_OFF);
518     }
519 
520     if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_GLU_IN_DIFFERENT_DIR)
521        && pGLUDriverFilePath && pGLUDriverFilePath[0]
522        && !_glsCompareDirectories(pGLDriverFilePath,pGLUDriverFilePath))
523     {
524         /* the GL and GLU are in different directories, so fail */
525         pGLDriverFilePath = pGLUDriverFilePath = 0;
526     }
527 
528     if(pGLDriverFilePath
529        && ((_glsGLDriverHandle = LoadLibrary(pGLDriverFilePath)) != 0))
530     {
531         /* the DYNALINK_*_FUNCTION macros will OR into this to signal error */
532         int DynalinkFailed = 0;
533 
534         /* macros for dynalinking */
535 #define _ERROR_WRAP( func ) ((func) != 0) ? 0 : (DynalinkFailed |= 1)
536 #define _STRINGIZE_NAME(name) #name
537 #define _STRINGIZE_NAME0(name) _STRINGIZE_NAME(name)
538 #define _WGLIZE_STRINGIZE_NAME( name ) _STRINGIZE_NAME0(wgl##name)
539 #define DYNALINK_GL_FUNCTION( name ) _ERROR_WRAP((*(int (__stdcall **)())&name) = GetProcAddress(_glsGLDriverHandle,#name))
540 #define DYNALINK_GLU_FUNCTION( name ) _ERROR_WRAP((*(int (__stdcall **)())&name) = GetProcAddress(_glsGLUDriverHandle,#name))
541 #define DYNALINK_GLS_FUNCTION( name ) _ERROR_WRAP((*(int (__stdcall **)())&GLS_SCOPE_NAME(name)) = GetProcAddress(_glsGLDriverHandle,_WGLIZE_STRINGIZE_NAME(name)))
542 #define DYNALINK_GDI_FUNCTION( name ) _ERROR_WRAP((*(int (__stdcall **)())&GLS_SCOPE_NAME(name)) = GetProcAddress(_glsGDI32,#name))
543 
544         DYNALINK_GL_FUNCTION( glAccum );
545         DYNALINK_GL_FUNCTION( glAlphaFunc );
546         DYNALINK_GL_FUNCTION( glAreTexturesResident );
547         DYNALINK_GL_FUNCTION( glArrayElement );
548         DYNALINK_GL_FUNCTION( glBegin );
549         DYNALINK_GL_FUNCTION( glBindTexture );
550         DYNALINK_GL_FUNCTION( glBitmap );
551         DYNALINK_GL_FUNCTION( glBlendFunc );
552         DYNALINK_GL_FUNCTION( glCallList );
553         DYNALINK_GL_FUNCTION( glCallLists );
554         DYNALINK_GL_FUNCTION( glClear );
555         DYNALINK_GL_FUNCTION( glClearAccum );
556         DYNALINK_GL_FUNCTION( glClearColor );
557         DYNALINK_GL_FUNCTION( glClearDepth );
558         DYNALINK_GL_FUNCTION( glClearIndex );
559         DYNALINK_GL_FUNCTION( glClearStencil );
560         DYNALINK_GL_FUNCTION( glClipPlane );
561         DYNALINK_GL_FUNCTION( glColor3b );
562         DYNALINK_GL_FUNCTION( glColor3bv );
563         DYNALINK_GL_FUNCTION( glColor3d );
564         DYNALINK_GL_FUNCTION( glColor3dv );
565         DYNALINK_GL_FUNCTION( glColor3f );
566         DYNALINK_GL_FUNCTION( glColor3fv );
567         DYNALINK_GL_FUNCTION( glColor3i );
568         DYNALINK_GL_FUNCTION( glColor3iv );
569         DYNALINK_GL_FUNCTION( glColor3s );
570         DYNALINK_GL_FUNCTION( glColor3sv );
571         DYNALINK_GL_FUNCTION( glColor3ub );
572         DYNALINK_GL_FUNCTION( glColor3ubv );
573         DYNALINK_GL_FUNCTION( glColor3ui );
574         DYNALINK_GL_FUNCTION( glColor3uiv );
575         DYNALINK_GL_FUNCTION( glColor3us );
576         DYNALINK_GL_FUNCTION( glColor3usv );
577         DYNALINK_GL_FUNCTION( glColor4b );
578         DYNALINK_GL_FUNCTION( glColor4bv );
579         DYNALINK_GL_FUNCTION( glColor4d );
580         DYNALINK_GL_FUNCTION( glColor4dv );
581         DYNALINK_GL_FUNCTION( glColor4f );
582         DYNALINK_GL_FUNCTION( glColor4fv );
583         DYNALINK_GL_FUNCTION( glColor4i );
584         DYNALINK_GL_FUNCTION( glColor4iv );
585         DYNALINK_GL_FUNCTION( glColor4s );
586         DYNALINK_GL_FUNCTION( glColor4sv );
587         DYNALINK_GL_FUNCTION( glColor4ub );
588         DYNALINK_GL_FUNCTION( glColor4ubv );
589         DYNALINK_GL_FUNCTION( glColor4ui );
590         DYNALINK_GL_FUNCTION( glColor4uiv );
591         DYNALINK_GL_FUNCTION( glColor4us );
592         DYNALINK_GL_FUNCTION( glColor4usv );
593         DYNALINK_GL_FUNCTION( glColorMask );
594         DYNALINK_GL_FUNCTION( glColorMaterial );
595         DYNALINK_GL_FUNCTION( glColorPointer );
596         DYNALINK_GL_FUNCTION( glCopyPixels );
597         DYNALINK_GL_FUNCTION( glCopyTexImage1D );
598         DYNALINK_GL_FUNCTION( glCopyTexImage2D );
599         DYNALINK_GL_FUNCTION( glCopyTexSubImage1D );
600         DYNALINK_GL_FUNCTION( glCopyTexSubImage2D );
601         DYNALINK_GL_FUNCTION( glCullFace );
602         DYNALINK_GL_FUNCTION( glDeleteLists );
603         DYNALINK_GL_FUNCTION( glDeleteTextures );
604         DYNALINK_GL_FUNCTION( glDepthFunc );
605         DYNALINK_GL_FUNCTION( glDepthMask );
606         DYNALINK_GL_FUNCTION( glDepthRange );
607         DYNALINK_GL_FUNCTION( glDisable );
608         DYNALINK_GL_FUNCTION( glDisableClientState );
609         DYNALINK_GL_FUNCTION( glDrawArrays );
610         DYNALINK_GL_FUNCTION( glDrawBuffer );
611         DYNALINK_GL_FUNCTION( glDrawElements );
612         DYNALINK_GL_FUNCTION( glDrawPixels );
613         DYNALINK_GL_FUNCTION( glEdgeFlag );
614         DYNALINK_GL_FUNCTION( glEdgeFlagPointer );
615         DYNALINK_GL_FUNCTION( glEdgeFlagv );
616         DYNALINK_GL_FUNCTION( glEnable );
617         DYNALINK_GL_FUNCTION( glEnableClientState );
618         DYNALINK_GL_FUNCTION( glEnd );
619         DYNALINK_GL_FUNCTION( glEndList );
620         DYNALINK_GL_FUNCTION( glEvalCoord1d );
621         DYNALINK_GL_FUNCTION( glEvalCoord1dv );
622         DYNALINK_GL_FUNCTION( glEvalCoord1f );
623         DYNALINK_GL_FUNCTION( glEvalCoord1fv );
624         DYNALINK_GL_FUNCTION( glEvalCoord2d );
625         DYNALINK_GL_FUNCTION( glEvalCoord2dv );
626         DYNALINK_GL_FUNCTION( glEvalCoord2f );
627         DYNALINK_GL_FUNCTION( glEvalCoord2fv );
628         DYNALINK_GL_FUNCTION( glEvalMesh1 );
629         DYNALINK_GL_FUNCTION( glEvalMesh2 );
630         DYNALINK_GL_FUNCTION( glEvalPoint1 );
631         DYNALINK_GL_FUNCTION( glEvalPoint2 );
632         DYNALINK_GL_FUNCTION( glFeedbackBuffer );
633         DYNALINK_GL_FUNCTION( glFinish );
634         DYNALINK_GL_FUNCTION( glFlush );
635         DYNALINK_GL_FUNCTION( glFogf );
636         DYNALINK_GL_FUNCTION( glFogfv );
637         DYNALINK_GL_FUNCTION( glFogi );
638         DYNALINK_GL_FUNCTION( glFogiv );
639         DYNALINK_GL_FUNCTION( glFrontFace );
640         DYNALINK_GL_FUNCTION( glFrustum );
641         DYNALINK_GL_FUNCTION( glGenLists );
642         DYNALINK_GL_FUNCTION( glGenTextures );
643         DYNALINK_GL_FUNCTION( glGetBooleanv );
644         DYNALINK_GL_FUNCTION( glGetClipPlane );
645         DYNALINK_GL_FUNCTION( glGetDoublev );
646         DYNALINK_GL_FUNCTION( glGetError );
647         DYNALINK_GL_FUNCTION( glGetFloatv );
648         DYNALINK_GL_FUNCTION( glGetIntegerv );
649         DYNALINK_GL_FUNCTION( glGetLightfv );
650         DYNALINK_GL_FUNCTION( glGetLightiv );
651         DYNALINK_GL_FUNCTION( glGetMapdv );
652         DYNALINK_GL_FUNCTION( glGetMapfv );
653         DYNALINK_GL_FUNCTION( glGetMapiv );
654         DYNALINK_GL_FUNCTION( glGetMaterialfv );
655         DYNALINK_GL_FUNCTION( glGetMaterialiv );
656         DYNALINK_GL_FUNCTION( glGetPixelMapfv );
657         DYNALINK_GL_FUNCTION( glGetPixelMapuiv );
658         DYNALINK_GL_FUNCTION( glGetPixelMapusv );
659         DYNALINK_GL_FUNCTION( glGetPointerv );
660         DYNALINK_GL_FUNCTION( glGetPolygonStipple );
661         DYNALINK_GL_FUNCTION( glGetString );
662         DYNALINK_GL_FUNCTION( glGetTexEnvfv );
663         DYNALINK_GL_FUNCTION( glGetTexEnviv );
664         DYNALINK_GL_FUNCTION( glGetTexGendv );
665         DYNALINK_GL_FUNCTION( glGetTexGenfv );
666         DYNALINK_GL_FUNCTION( glGetTexGeniv );
667         DYNALINK_GL_FUNCTION( glGetTexImage );
668         DYNALINK_GL_FUNCTION( glGetTexLevelParameterfv );
669         DYNALINK_GL_FUNCTION( glGetTexLevelParameteriv );
670         DYNALINK_GL_FUNCTION( glGetTexParameterfv );
671         DYNALINK_GL_FUNCTION( glGetTexParameteriv );
672         DYNALINK_GL_FUNCTION( glHint );
673         DYNALINK_GL_FUNCTION( glIndexMask );
674         DYNALINK_GL_FUNCTION( glIndexPointer );
675         DYNALINK_GL_FUNCTION( glIndexd );
676         DYNALINK_GL_FUNCTION( glIndexdv );
677         DYNALINK_GL_FUNCTION( glIndexf );
678         DYNALINK_GL_FUNCTION( glIndexfv );
679         DYNALINK_GL_FUNCTION( glIndexi );
680         DYNALINK_GL_FUNCTION( glIndexiv );
681         DYNALINK_GL_FUNCTION( glIndexs );
682         DYNALINK_GL_FUNCTION( glIndexsv );
683         DYNALINK_GL_FUNCTION( glIndexub );
684         DYNALINK_GL_FUNCTION( glIndexubv );
685         DYNALINK_GL_FUNCTION( glInitNames );
686         DYNALINK_GL_FUNCTION( glInterleavedArrays );
687         DYNALINK_GL_FUNCTION( glIsEnabled );
688         DYNALINK_GL_FUNCTION( glIsList );
689         DYNALINK_GL_FUNCTION( glIsTexture );
690         DYNALINK_GL_FUNCTION( glLightModelf );
691         DYNALINK_GL_FUNCTION( glLightModelfv );
692         DYNALINK_GL_FUNCTION( glLightModeli );
693         DYNALINK_GL_FUNCTION( glLightModeliv );
694         DYNALINK_GL_FUNCTION( glLightf );
695         DYNALINK_GL_FUNCTION( glLightfv );
696         DYNALINK_GL_FUNCTION( glLighti );
697         DYNALINK_GL_FUNCTION( glLightiv );
698         DYNALINK_GL_FUNCTION( glLineStipple );
699         DYNALINK_GL_FUNCTION( glLineWidth );
700         DYNALINK_GL_FUNCTION( glListBase );
701         DYNALINK_GL_FUNCTION( glLoadIdentity );
702         DYNALINK_GL_FUNCTION( glLoadMatrixd );
703         DYNALINK_GL_FUNCTION( glLoadMatrixf );
704         DYNALINK_GL_FUNCTION( glLoadName );
705         DYNALINK_GL_FUNCTION( glLogicOp );
706         DYNALINK_GL_FUNCTION( glMap1d );
707         DYNALINK_GL_FUNCTION( glMap1f );
708         DYNALINK_GL_FUNCTION( glMap2d );
709         DYNALINK_GL_FUNCTION( glMap2f );
710         DYNALINK_GL_FUNCTION( glMapGrid1d );
711         DYNALINK_GL_FUNCTION( glMapGrid1f );
712         DYNALINK_GL_FUNCTION( glMapGrid2d );
713         DYNALINK_GL_FUNCTION( glMapGrid2f );
714         DYNALINK_GL_FUNCTION( glMaterialf );
715         DYNALINK_GL_FUNCTION( glMaterialfv );
716         DYNALINK_GL_FUNCTION( glMateriali );
717         DYNALINK_GL_FUNCTION( glMaterialiv );
718         DYNALINK_GL_FUNCTION( glMatrixMode );
719         DYNALINK_GL_FUNCTION( glMultMatrixd );
720         DYNALINK_GL_FUNCTION( glMultMatrixf );
721         DYNALINK_GL_FUNCTION( glNewList );
722         DYNALINK_GL_FUNCTION( glNormal3b );
723         DYNALINK_GL_FUNCTION( glNormal3bv );
724         DYNALINK_GL_FUNCTION( glNormal3d );
725         DYNALINK_GL_FUNCTION( glNormal3dv );
726         DYNALINK_GL_FUNCTION( glNormal3f );
727         DYNALINK_GL_FUNCTION( glNormal3fv );
728         DYNALINK_GL_FUNCTION( glNormal3i );
729         DYNALINK_GL_FUNCTION( glNormal3iv );
730         DYNALINK_GL_FUNCTION( glNormal3s );
731         DYNALINK_GL_FUNCTION( glNormal3sv );
732         DYNALINK_GL_FUNCTION( glNormalPointer );
733         DYNALINK_GL_FUNCTION( glOrtho );
734         DYNALINK_GL_FUNCTION( glPassThrough );
735         DYNALINK_GL_FUNCTION( glPixelMapfv );
736         DYNALINK_GL_FUNCTION( glPixelMapuiv );
737         DYNALINK_GL_FUNCTION( glPixelMapusv );
738         DYNALINK_GL_FUNCTION( glPixelStoref );
739         DYNALINK_GL_FUNCTION( glPixelStorei );
740         DYNALINK_GL_FUNCTION( glPixelTransferf );
741         DYNALINK_GL_FUNCTION( glPixelTransferi );
742         DYNALINK_GL_FUNCTION( glPixelZoom );
743         DYNALINK_GL_FUNCTION( glPointSize );
744         DYNALINK_GL_FUNCTION( glPolygonMode );
745         DYNALINK_GL_FUNCTION( glPolygonOffset );
746         DYNALINK_GL_FUNCTION( glPolygonStipple );
747         DYNALINK_GL_FUNCTION( glPopAttrib );
748         DYNALINK_GL_FUNCTION( glPopClientAttrib );
749         DYNALINK_GL_FUNCTION( glPopMatrix );
750         DYNALINK_GL_FUNCTION( glPopName );
751         DYNALINK_GL_FUNCTION( glPrioritizeTextures );
752         DYNALINK_GL_FUNCTION( glPushAttrib );
753         DYNALINK_GL_FUNCTION( glPushClientAttrib );
754         DYNALINK_GL_FUNCTION( glPushMatrix );
755         DYNALINK_GL_FUNCTION( glPushName );
756         DYNALINK_GL_FUNCTION( glRasterPos2d );
757         DYNALINK_GL_FUNCTION( glRasterPos2dv );
758         DYNALINK_GL_FUNCTION( glRasterPos2f );
759         DYNALINK_GL_FUNCTION( glRasterPos2fv );
760         DYNALINK_GL_FUNCTION( glRasterPos2i );
761         DYNALINK_GL_FUNCTION( glRasterPos2iv );
762         DYNALINK_GL_FUNCTION( glRasterPos2s );
763         DYNALINK_GL_FUNCTION( glRasterPos2sv );
764         DYNALINK_GL_FUNCTION( glRasterPos3d );
765         DYNALINK_GL_FUNCTION( glRasterPos3dv );
766         DYNALINK_GL_FUNCTION( glRasterPos3f );
767         DYNALINK_GL_FUNCTION( glRasterPos3fv );
768         DYNALINK_GL_FUNCTION( glRasterPos3i );
769         DYNALINK_GL_FUNCTION( glRasterPos3iv );
770         DYNALINK_GL_FUNCTION( glRasterPos3s );
771         DYNALINK_GL_FUNCTION( glRasterPos3sv );
772         DYNALINK_GL_FUNCTION( glRasterPos4d );
773         DYNALINK_GL_FUNCTION( glRasterPos4dv );
774         DYNALINK_GL_FUNCTION( glRasterPos4f );
775         DYNALINK_GL_FUNCTION( glRasterPos4fv );
776         DYNALINK_GL_FUNCTION( glRasterPos4i );
777         DYNALINK_GL_FUNCTION( glRasterPos4iv );
778         DYNALINK_GL_FUNCTION( glRasterPos4s );
779         DYNALINK_GL_FUNCTION( glRasterPos4sv );
780         DYNALINK_GL_FUNCTION( glReadBuffer );
781         DYNALINK_GL_FUNCTION( glReadPixels );
782         DYNALINK_GL_FUNCTION( glRectd );
783         DYNALINK_GL_FUNCTION( glRectdv );
784         DYNALINK_GL_FUNCTION( glRectf );
785         DYNALINK_GL_FUNCTION( glRectfv );
786         DYNALINK_GL_FUNCTION( glRecti );
787         DYNALINK_GL_FUNCTION( glRectiv );
788         DYNALINK_GL_FUNCTION( glRects );
789         DYNALINK_GL_FUNCTION( glRectsv );
790         DYNALINK_GL_FUNCTION( glRenderMode );
791         DYNALINK_GL_FUNCTION( glRotated );
792         DYNALINK_GL_FUNCTION( glRotatef );
793         DYNALINK_GL_FUNCTION( glScaled );
794         DYNALINK_GL_FUNCTION( glScalef );
795         DYNALINK_GL_FUNCTION( glScissor );
796         DYNALINK_GL_FUNCTION( glSelectBuffer );
797         DYNALINK_GL_FUNCTION( glShadeModel );
798         DYNALINK_GL_FUNCTION( glStencilFunc );
799         DYNALINK_GL_FUNCTION( glStencilMask );
800         DYNALINK_GL_FUNCTION( glStencilOp );
801         DYNALINK_GL_FUNCTION( glTexCoord1d );
802         DYNALINK_GL_FUNCTION( glTexCoord1dv );
803         DYNALINK_GL_FUNCTION( glTexCoord1f );
804         DYNALINK_GL_FUNCTION( glTexCoord1fv );
805         DYNALINK_GL_FUNCTION( glTexCoord1i );
806         DYNALINK_GL_FUNCTION( glTexCoord1iv );
807         DYNALINK_GL_FUNCTION( glTexCoord1s );
808         DYNALINK_GL_FUNCTION( glTexCoord1sv );
809         DYNALINK_GL_FUNCTION( glTexCoord2d );
810         DYNALINK_GL_FUNCTION( glTexCoord2dv );
811         DYNALINK_GL_FUNCTION( glTexCoord2f );
812         DYNALINK_GL_FUNCTION( glTexCoord2fv );
813         DYNALINK_GL_FUNCTION( glTexCoord2i );
814         DYNALINK_GL_FUNCTION( glTexCoord2iv );
815         DYNALINK_GL_FUNCTION( glTexCoord2s );
816         DYNALINK_GL_FUNCTION( glTexCoord2sv );
817         DYNALINK_GL_FUNCTION( glTexCoord3d );
818         DYNALINK_GL_FUNCTION( glTexCoord3dv );
819         DYNALINK_GL_FUNCTION( glTexCoord3f );
820         DYNALINK_GL_FUNCTION( glTexCoord3fv );
821         DYNALINK_GL_FUNCTION( glTexCoord3i );
822         DYNALINK_GL_FUNCTION( glTexCoord3iv );
823         DYNALINK_GL_FUNCTION( glTexCoord3s );
824         DYNALINK_GL_FUNCTION( glTexCoord3sv );
825         DYNALINK_GL_FUNCTION( glTexCoord4d );
826         DYNALINK_GL_FUNCTION( glTexCoord4dv );
827         DYNALINK_GL_FUNCTION( glTexCoord4f );
828         DYNALINK_GL_FUNCTION( glTexCoord4fv );
829         DYNALINK_GL_FUNCTION( glTexCoord4i );
830         DYNALINK_GL_FUNCTION( glTexCoord4iv );
831         DYNALINK_GL_FUNCTION( glTexCoord4s );
832         DYNALINK_GL_FUNCTION( glTexCoord4sv );
833         DYNALINK_GL_FUNCTION( glTexCoordPointer );
834         DYNALINK_GL_FUNCTION( glTexEnvf );
835         DYNALINK_GL_FUNCTION( glTexEnvfv );
836         DYNALINK_GL_FUNCTION( glTexEnvi );
837         DYNALINK_GL_FUNCTION( glTexEnviv );
838         DYNALINK_GL_FUNCTION( glTexGend );
839         DYNALINK_GL_FUNCTION( glTexGendv );
840         DYNALINK_GL_FUNCTION( glTexGenf );
841         DYNALINK_GL_FUNCTION( glTexGenfv );
842         DYNALINK_GL_FUNCTION( glTexGeni );
843         DYNALINK_GL_FUNCTION( glTexGeniv );
844         DYNALINK_GL_FUNCTION( glTexImage1D );
845         DYNALINK_GL_FUNCTION( glTexImage2D );
846         DYNALINK_GL_FUNCTION( glTexParameterf );
847         DYNALINK_GL_FUNCTION( glTexParameterfv );
848         DYNALINK_GL_FUNCTION( glTexParameteri );
849         DYNALINK_GL_FUNCTION( glTexParameteriv );
850         DYNALINK_GL_FUNCTION( glTexSubImage1D );
851         DYNALINK_GL_FUNCTION( glTexSubImage2D );
852         DYNALINK_GL_FUNCTION( glTranslated );
853         DYNALINK_GL_FUNCTION( glTranslatef );
854         DYNALINK_GL_FUNCTION( glVertex2d );
855         DYNALINK_GL_FUNCTION( glVertex2dv );
856         DYNALINK_GL_FUNCTION( glVertex2f );
857         DYNALINK_GL_FUNCTION( glVertex2fv );
858         DYNALINK_GL_FUNCTION( glVertex2i );
859         DYNALINK_GL_FUNCTION( glVertex2iv );
860         DYNALINK_GL_FUNCTION( glVertex2s );
861         DYNALINK_GL_FUNCTION( glVertex2sv );
862         DYNALINK_GL_FUNCTION( glVertex3d );
863         DYNALINK_GL_FUNCTION( glVertex3dv );
864         DYNALINK_GL_FUNCTION( glVertex3f );
865         DYNALINK_GL_FUNCTION( glVertex3fv );
866         DYNALINK_GL_FUNCTION( glVertex3i );
867         DYNALINK_GL_FUNCTION( glVertex3iv );
868         DYNALINK_GL_FUNCTION( glVertex3s );
869         DYNALINK_GL_FUNCTION( glVertex3sv );
870         DYNALINK_GL_FUNCTION( glVertex4d );
871         DYNALINK_GL_FUNCTION( glVertex4dv );
872         DYNALINK_GL_FUNCTION( glVertex4f );
873         DYNALINK_GL_FUNCTION( glVertex4fv );
874         DYNALINK_GL_FUNCTION( glVertex4i );
875         DYNALINK_GL_FUNCTION( glVertex4iv );
876         DYNALINK_GL_FUNCTION( glVertex4s );
877         DYNALINK_GL_FUNCTION( glVertex4sv );
878         DYNALINK_GL_FUNCTION( glVertexPointer );
879         DYNALINK_GL_FUNCTION( glViewport );
880 
881         DYNALINK_GLS_FUNCTION( CopyContext );
882         DYNALINK_GLS_FUNCTION( CreateContext );
883         DYNALINK_GLS_FUNCTION( CreateLayerContext );
884         DYNALINK_GLS_FUNCTION( DeleteContext );
885         DYNALINK_GLS_FUNCTION( DescribeLayerPlane );
886         DYNALINK_GLS_FUNCTION( GetCurrentContext );
887         DYNALINK_GLS_FUNCTION( GetCurrentDC );
888         DYNALINK_GLS_FUNCTION( GetLayerPaletteEntries );
889         DYNALINK_GLS_FUNCTION( GetProcAddress );
890         DYNALINK_GLS_FUNCTION( MakeCurrent );
891         DYNALINK_GLS_FUNCTION( RealizeLayerPalette );
892         DYNALINK_GLS_FUNCTION( SetLayerPaletteEntries );
893         DYNALINK_GLS_FUNCTION( ShareLists );
894         DYNALINK_GLS_FUNCTION( SwapLayerBuffers );
895         DYNALINK_GLS_FUNCTION( UseFontBitmaps );
896         DYNALINK_GLS_FUNCTION( UseFontOutlines );
897 
898         if(_glsIsDefaultOpenGL(pGLDriverFilePath))
899         {
900             /* if this is the default opengl32.dll, we need to
901                dynalink from gdi32.dll for the following functions
902                because Win2k does some magic before calling opengl32.dll */
903 
904             if((_glsGDI32 = LoadLibrary("gdi32.dll")) != 0)
905             {
906                 DYNALINK_GDI_FUNCTION( ChoosePixelFormat );
907                 DYNALINK_GDI_FUNCTION( DescribePixelFormat );
908                 DYNALINK_GDI_FUNCTION( GetPixelFormat );
909                 DYNALINK_GDI_FUNCTION( SetPixelFormat );
910                 DYNALINK_GDI_FUNCTION( SwapBuffers );
911             }
912             else
913             {
914                 DynalinkFailed = 1;
915             }
916         }
917         else
918         {
919             DYNALINK_GLS_FUNCTION( ChoosePixelFormat );
920             DYNALINK_GLS_FUNCTION( DescribePixelFormat );
921             DYNALINK_GLS_FUNCTION( GetPixelFormat );
922             DYNALINK_GLS_FUNCTION( SetPixelFormat );
923             DYNALINK_GLS_FUNCTION( SwapBuffers );
924         }
925 
926         /* copy the loaded file path into the global variable */
927         _safe_strncpy(_glsGLDriverFilePath,pGLDriverFilePath,
928                       sizeof(_glsGLDriverFilePath));
929 
930 #ifndef GLS_NO_GLU
931 
932         /* now do GLU if the user requested it */
933 
934         if(!(_glsBehavior & GLS_BEHAVIOR_NEVER_LOAD_GLU)
935            && pGLUDriverFilePath && pGLUDriverFilePath[0])
936         {
937             _glsGLUDriverHandle = LoadLibrary(pGLUDriverFilePath);
938             if(_glsGLUDriverHandle)
939             {
940                 DYNALINK_GLU_FUNCTION( gluBeginCurve );
941                 DYNALINK_GLU_FUNCTION( gluBeginPolygon );
942                 DYNALINK_GLU_FUNCTION( gluBeginSurface );
943                 DYNALINK_GLU_FUNCTION( gluBeginTrim );
944                 DYNALINK_GLU_FUNCTION( gluBuild1DMipmaps );
945                 DYNALINK_GLU_FUNCTION( gluBuild2DMipmaps );
946                 DYNALINK_GLU_FUNCTION( gluCylinder );
947                 DYNALINK_GLU_FUNCTION( gluDeleteNurbsRenderer );
948                 DYNALINK_GLU_FUNCTION( gluDeleteQuadric );
949                 DYNALINK_GLU_FUNCTION( gluDeleteTess );
950                 DYNALINK_GLU_FUNCTION( gluDisk );
951                 DYNALINK_GLU_FUNCTION( gluEndCurve );
952                 DYNALINK_GLU_FUNCTION( gluEndPolygon );
953                 DYNALINK_GLU_FUNCTION( gluEndSurface );
954                 DYNALINK_GLU_FUNCTION( gluEndTrim );
955                 DYNALINK_GLU_FUNCTION( gluErrorString );
956                 DYNALINK_GLU_FUNCTION( gluGetNurbsProperty );
957                 DYNALINK_GLU_FUNCTION( gluGetString );
958                 DYNALINK_GLU_FUNCTION( gluGetTessProperty );
959                 DYNALINK_GLU_FUNCTION( gluLoadSamplingMatrices );
960                 DYNALINK_GLU_FUNCTION( gluLookAt );
961                 DYNALINK_GLU_FUNCTION( gluNewNurbsRenderer );
962                 DYNALINK_GLU_FUNCTION( gluNewQuadric );
963                 DYNALINK_GLU_FUNCTION( gluNewTess );
964                 DYNALINK_GLU_FUNCTION( gluNextContour );
965                 DYNALINK_GLU_FUNCTION( gluNurbsCallback );
966                 DYNALINK_GLU_FUNCTION( gluNurbsCurve );
967                 DYNALINK_GLU_FUNCTION( gluNurbsProperty );
968                 DYNALINK_GLU_FUNCTION( gluNurbsSurface );
969                 DYNALINK_GLU_FUNCTION( gluOrtho2D );
970                 DYNALINK_GLU_FUNCTION( gluPartialDisk );
971                 DYNALINK_GLU_FUNCTION( gluPerspective );
972                 DYNALINK_GLU_FUNCTION( gluPickMatrix );
973                 DYNALINK_GLU_FUNCTION( gluProject );
974                 DYNALINK_GLU_FUNCTION( gluPwlCurve );
975                 DYNALINK_GLU_FUNCTION( gluQuadricCallback );
976                 DYNALINK_GLU_FUNCTION( gluQuadricDrawStyle );
977                 DYNALINK_GLU_FUNCTION( gluQuadricNormals );
978                 DYNALINK_GLU_FUNCTION( gluQuadricOrientation );
979                 DYNALINK_GLU_FUNCTION( gluQuadricTexture );
980                 DYNALINK_GLU_FUNCTION( gluScaleImage );
981                 DYNALINK_GLU_FUNCTION( gluSphere );
982                 DYNALINK_GLU_FUNCTION( gluTessBeginContour );
983                 DYNALINK_GLU_FUNCTION( gluTessBeginPolygon );
984                 DYNALINK_GLU_FUNCTION( gluTessCallback );
985                 DYNALINK_GLU_FUNCTION( gluTessEndContour );
986                 DYNALINK_GLU_FUNCTION( gluTessEndPolygon );
987                 DYNALINK_GLU_FUNCTION( gluTessNormal );
988                 DYNALINK_GLU_FUNCTION( gluTessProperty );
989                 DYNALINK_GLU_FUNCTION( gluTessVertex );
990                 DYNALINK_GLU_FUNCTION( gluUnProject );
991 
992                 /* copy the loaded file path into the global variable */
993                 _safe_strncpy(_glsGLUDriverFilePath,pGLUDriverFilePath,
994                               sizeof(_glsGLUDriverFilePath));
995             }
996             else
997             {
998                 DynalinkFailed = 1;
999             }
1000         }
1001         else
1002         {
1003             /* no GLU requested */
1004             _glsGLUDriverFilePath[0] = 0;
1005         }
1006 #endif  /* GLS_NO_GLU */
1007 
1008 #undef _STRING_NAME
1009 #undef _STRING_NAME0
1010 #undef _WGLIZE_STRINGIZE_NAME
1011 #undef _ERROR_WRAP
1012 #undef DYNALINK_GDI_FUNCTION
1013 #undef DYNALINK_GL_FUNCTION
1014 #undef DYNALINK_GLU_FUNCTION
1015 #undef DYNALINK_GLS_FUNCTION
1016 
1017         if(DynalinkFailed)
1018         {
1019             ErrorCode = GLS_ERROR_DRIVER_DYNALINK_FAILED;
1020             glsUnloadDriver();
1021         }
1022         else
1023         {
1024             ErrorCode = GLS_ERROR_OK;
1025         }
1026     }
1027     return ErrorCode;
1028 }
1029 
1030 /*----------------------------------------------------------------------------
1031 
1032 glsUnloadDriver - closes down the binding library and cleans up.
1033 
1034 */
1035 
glsUnloadDriver(void)1036 void glsUnloadDriver(void )
1037 {
1038     void (__stdcall *pInvalidFunction)( void ) = 0;
1039 
1040     if (_glsGLDriverHandle)
1041     {
1042         FreeLibrary(_glsGLDriverHandle);
1043         _glsGLDriverHandle = 0;
1044     }
1045     if (_glsGLUDriverHandle)
1046     {
1047         FreeLibrary(_glsGLUDriverHandle);
1048         _glsGLUDriverHandle = 0;
1049     }
1050     if(_glsGDI32)
1051     {
1052         FreeLibrary(_glsGDI32);
1053         _glsGDI32 = 0;
1054     }
1055 
1056     /* restore environment and registry */
1057     if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_GRATUITOUS_HYPE_SCREENS))
1058     {
1059         if(_glsRead3dfxSplashEnv)
1060         {
1061             _glsSetEnv(_GLS_3DFX_SPLASH_STRING,_gls3dfxSplashEnv);
1062             _glsRead3dfxSplashEnv = FALSE;
1063         }
1064     }
1065     if(!(_glsBehavior & GLS_BEHAVIOR_ALLOW_SOFTWARE_REVECTORING))
1066     {
1067         if(_glsReadSGIRegistryEntry)
1068         {
1069             _glsSetRegistryDWORD(_GLS_SGI_REGISTRY_ROOT,_GLS_SGI_REGISTRY_KEY,
1070                                  _GLS_SGI_REGISTRY_VALUE,_glsSGIRegistryEntry);
1071             _glsReadSGIRegistryEntry = FALSE;
1072         }
1073     }
1074 
1075     if(_glsBehavior & GLS_BEHAVIOR_INVALID_FUNCTIONS_DEBUGBREAK)
1076     {
1077         pInvalidFunction = _glsDebugBreakFunction;
1078     }
1079 
1080 #define DISABLE_GL_FUNCTION( name ) (*(void (__stdcall **)())&name) = pInvalidFunction;
1081 #define DISABLE_GLU_FUNCTION( name ) (*(void (__stdcall **)())&name) = pInvalidFunction;
1082 #define DISABLE_GLS_FUNCTION( name ) (*(void (__stdcall **)())&GLS_SCOPE_NAME(name)) = pInvalidFunction;
1083 
1084     DISABLE_GL_FUNCTION( glAccum );
1085     DISABLE_GL_FUNCTION( glAlphaFunc );
1086     DISABLE_GL_FUNCTION( glAreTexturesResident );
1087     DISABLE_GL_FUNCTION( glArrayElement );
1088     DISABLE_GL_FUNCTION( glBegin );
1089     DISABLE_GL_FUNCTION( glBindTexture );
1090     DISABLE_GL_FUNCTION( glBitmap );
1091     DISABLE_GL_FUNCTION( glBlendFunc );
1092     DISABLE_GL_FUNCTION( glCallList );
1093     DISABLE_GL_FUNCTION( glCallLists );
1094     DISABLE_GL_FUNCTION( glClear );
1095     DISABLE_GL_FUNCTION( glClearAccum );
1096     DISABLE_GL_FUNCTION( glClearColor );
1097     DISABLE_GL_FUNCTION( glClearDepth );
1098     DISABLE_GL_FUNCTION( glClearIndex );
1099     DISABLE_GL_FUNCTION( glClearStencil );
1100     DISABLE_GL_FUNCTION( glClipPlane );
1101     DISABLE_GL_FUNCTION( glColor3b );
1102     DISABLE_GL_FUNCTION( glColor3bv );
1103     DISABLE_GL_FUNCTION( glColor3d );
1104     DISABLE_GL_FUNCTION( glColor3dv );
1105     DISABLE_GL_FUNCTION( glColor3f );
1106     DISABLE_GL_FUNCTION( glColor3fv );
1107     DISABLE_GL_FUNCTION( glColor3i );
1108     DISABLE_GL_FUNCTION( glColor3iv );
1109     DISABLE_GL_FUNCTION( glColor3s );
1110     DISABLE_GL_FUNCTION( glColor3sv );
1111     DISABLE_GL_FUNCTION( glColor3ub );
1112     DISABLE_GL_FUNCTION( glColor3ubv );
1113     DISABLE_GL_FUNCTION( glColor3ui );
1114     DISABLE_GL_FUNCTION( glColor3uiv );
1115     DISABLE_GL_FUNCTION( glColor3us );
1116     DISABLE_GL_FUNCTION( glColor3usv );
1117     DISABLE_GL_FUNCTION( glColor4b );
1118     DISABLE_GL_FUNCTION( glColor4bv );
1119     DISABLE_GL_FUNCTION( glColor4d );
1120     DISABLE_GL_FUNCTION( glColor4dv );
1121     DISABLE_GL_FUNCTION( glColor4f );
1122     DISABLE_GL_FUNCTION( glColor4fv );
1123     DISABLE_GL_FUNCTION( glColor4i );
1124     DISABLE_GL_FUNCTION( glColor4iv );
1125     DISABLE_GL_FUNCTION( glColor4s );
1126     DISABLE_GL_FUNCTION( glColor4sv );
1127     DISABLE_GL_FUNCTION( glColor4ub );
1128     DISABLE_GL_FUNCTION( glColor4ubv );
1129     DISABLE_GL_FUNCTION( glColor4ui );
1130     DISABLE_GL_FUNCTION( glColor4uiv );
1131     DISABLE_GL_FUNCTION( glColor4us );
1132     DISABLE_GL_FUNCTION( glColor4usv );
1133     DISABLE_GL_FUNCTION( glColorMask );
1134     DISABLE_GL_FUNCTION( glColorMaterial );
1135     DISABLE_GL_FUNCTION( glColorPointer );
1136     DISABLE_GL_FUNCTION( glCopyPixels );
1137     DISABLE_GL_FUNCTION( glCopyTexImage1D );
1138     DISABLE_GL_FUNCTION( glCopyTexImage2D );
1139     DISABLE_GL_FUNCTION( glCopyTexSubImage1D );
1140     DISABLE_GL_FUNCTION( glCopyTexSubImage2D );
1141     DISABLE_GL_FUNCTION( glCullFace );
1142     DISABLE_GL_FUNCTION( glDeleteLists );
1143     DISABLE_GL_FUNCTION( glDeleteTextures );
1144     DISABLE_GL_FUNCTION( glDepthFunc );
1145     DISABLE_GL_FUNCTION( glDepthMask );
1146     DISABLE_GL_FUNCTION( glDepthRange );
1147     DISABLE_GL_FUNCTION( glDisable );
1148     DISABLE_GL_FUNCTION( glDisableClientState );
1149     DISABLE_GL_FUNCTION( glDrawArrays );
1150     DISABLE_GL_FUNCTION( glDrawBuffer );
1151     DISABLE_GL_FUNCTION( glDrawElements );
1152     DISABLE_GL_FUNCTION( glDrawPixels );
1153     DISABLE_GL_FUNCTION( glEdgeFlag );
1154     DISABLE_GL_FUNCTION( glEdgeFlagPointer );
1155     DISABLE_GL_FUNCTION( glEdgeFlagv );
1156     DISABLE_GL_FUNCTION( glEnable );
1157     DISABLE_GL_FUNCTION( glEnableClientState );
1158     DISABLE_GL_FUNCTION( glEnd );
1159     DISABLE_GL_FUNCTION( glEndList );
1160     DISABLE_GL_FUNCTION( glEvalCoord1d );
1161     DISABLE_GL_FUNCTION( glEvalCoord1dv );
1162     DISABLE_GL_FUNCTION( glEvalCoord1f );
1163     DISABLE_GL_FUNCTION( glEvalCoord1fv );
1164     DISABLE_GL_FUNCTION( glEvalCoord2d );
1165     DISABLE_GL_FUNCTION( glEvalCoord2dv );
1166     DISABLE_GL_FUNCTION( glEvalCoord2f );
1167     DISABLE_GL_FUNCTION( glEvalCoord2fv );
1168     DISABLE_GL_FUNCTION( glEvalMesh1 );
1169     DISABLE_GL_FUNCTION( glEvalMesh2 );
1170     DISABLE_GL_FUNCTION( glEvalPoint1 );
1171     DISABLE_GL_FUNCTION( glEvalPoint2 );
1172     DISABLE_GL_FUNCTION( glFeedbackBuffer );
1173     DISABLE_GL_FUNCTION( glFinish );
1174     DISABLE_GL_FUNCTION( glFlush );
1175     DISABLE_GL_FUNCTION( glFogf );
1176     DISABLE_GL_FUNCTION( glFogfv );
1177     DISABLE_GL_FUNCTION( glFogi );
1178     DISABLE_GL_FUNCTION( glFogiv );
1179     DISABLE_GL_FUNCTION( glFrontFace );
1180     DISABLE_GL_FUNCTION( glFrustum );
1181     DISABLE_GL_FUNCTION( glGenLists );
1182     DISABLE_GL_FUNCTION( glGenTextures );
1183     DISABLE_GL_FUNCTION( glGetBooleanv );
1184     DISABLE_GL_FUNCTION( glGetClipPlane );
1185     DISABLE_GL_FUNCTION( glGetDoublev );
1186     DISABLE_GL_FUNCTION( glGetError );
1187     DISABLE_GL_FUNCTION( glGetFloatv );
1188     DISABLE_GL_FUNCTION( glGetIntegerv );
1189     DISABLE_GL_FUNCTION( glGetLightfv );
1190     DISABLE_GL_FUNCTION( glGetLightiv );
1191     DISABLE_GL_FUNCTION( glGetMapdv );
1192     DISABLE_GL_FUNCTION( glGetMapfv );
1193     DISABLE_GL_FUNCTION( glGetMapiv );
1194     DISABLE_GL_FUNCTION( glGetMaterialfv );
1195     DISABLE_GL_FUNCTION( glGetMaterialiv );
1196     DISABLE_GL_FUNCTION( glGetPixelMapfv );
1197     DISABLE_GL_FUNCTION( glGetPixelMapuiv );
1198     DISABLE_GL_FUNCTION( glGetPixelMapusv );
1199     DISABLE_GL_FUNCTION( glGetPointerv );
1200     DISABLE_GL_FUNCTION( glGetPolygonStipple );
1201     DISABLE_GL_FUNCTION( glGetString );
1202     DISABLE_GL_FUNCTION( glGetTexEnvfv );
1203     DISABLE_GL_FUNCTION( glGetTexEnviv );
1204     DISABLE_GL_FUNCTION( glGetTexGendv );
1205     DISABLE_GL_FUNCTION( glGetTexGenfv );
1206     DISABLE_GL_FUNCTION( glGetTexGeniv );
1207     DISABLE_GL_FUNCTION( glGetTexImage );
1208     DISABLE_GL_FUNCTION( glGetTexLevelParameterfv );
1209     DISABLE_GL_FUNCTION( glGetTexLevelParameteriv );
1210     DISABLE_GL_FUNCTION( glGetTexParameterfv );
1211     DISABLE_GL_FUNCTION( glGetTexParameteriv );
1212     DISABLE_GL_FUNCTION( glHint );
1213     DISABLE_GL_FUNCTION( glIndexMask );
1214     DISABLE_GL_FUNCTION( glIndexPointer );
1215     DISABLE_GL_FUNCTION( glIndexd );
1216     DISABLE_GL_FUNCTION( glIndexdv );
1217     DISABLE_GL_FUNCTION( glIndexf );
1218     DISABLE_GL_FUNCTION( glIndexfv );
1219     DISABLE_GL_FUNCTION( glIndexi );
1220     DISABLE_GL_FUNCTION( glIndexiv );
1221     DISABLE_GL_FUNCTION( glIndexs );
1222     DISABLE_GL_FUNCTION( glIndexsv );
1223     DISABLE_GL_FUNCTION( glIndexub );
1224     DISABLE_GL_FUNCTION( glIndexubv );
1225     DISABLE_GL_FUNCTION( glInitNames );
1226     DISABLE_GL_FUNCTION( glInterleavedArrays );
1227     DISABLE_GL_FUNCTION( glIsEnabled );
1228     DISABLE_GL_FUNCTION( glIsList );
1229     DISABLE_GL_FUNCTION( glIsTexture );
1230     DISABLE_GL_FUNCTION( glLightModelf );
1231     DISABLE_GL_FUNCTION( glLightModelfv );
1232     DISABLE_GL_FUNCTION( glLightModeli );
1233     DISABLE_GL_FUNCTION( glLightModeliv );
1234     DISABLE_GL_FUNCTION( glLightf );
1235     DISABLE_GL_FUNCTION( glLightfv );
1236     DISABLE_GL_FUNCTION( glLighti );
1237     DISABLE_GL_FUNCTION( glLightiv );
1238     DISABLE_GL_FUNCTION( glLineStipple );
1239     DISABLE_GL_FUNCTION( glLineWidth );
1240     DISABLE_GL_FUNCTION( glListBase );
1241     DISABLE_GL_FUNCTION( glLoadIdentity );
1242     DISABLE_GL_FUNCTION( glLoadMatrixd );
1243     DISABLE_GL_FUNCTION( glLoadMatrixf );
1244     DISABLE_GL_FUNCTION( glLoadName );
1245     DISABLE_GL_FUNCTION( glLogicOp );
1246     DISABLE_GL_FUNCTION( glMap1d );
1247     DISABLE_GL_FUNCTION( glMap1f );
1248     DISABLE_GL_FUNCTION( glMap2d );
1249     DISABLE_GL_FUNCTION( glMap2f );
1250     DISABLE_GL_FUNCTION( glMapGrid1d );
1251     DISABLE_GL_FUNCTION( glMapGrid1f );
1252     DISABLE_GL_FUNCTION( glMapGrid2d );
1253     DISABLE_GL_FUNCTION( glMapGrid2f );
1254     DISABLE_GL_FUNCTION( glMaterialf );
1255     DISABLE_GL_FUNCTION( glMaterialfv );
1256     DISABLE_GL_FUNCTION( glMateriali );
1257     DISABLE_GL_FUNCTION( glMaterialiv );
1258     DISABLE_GL_FUNCTION( glMatrixMode );
1259     DISABLE_GL_FUNCTION( glMultMatrixd );
1260     DISABLE_GL_FUNCTION( glMultMatrixf );
1261     DISABLE_GL_FUNCTION( glNewList );
1262     DISABLE_GL_FUNCTION( glNormal3b );
1263     DISABLE_GL_FUNCTION( glNormal3bv );
1264     DISABLE_GL_FUNCTION( glNormal3d );
1265     DISABLE_GL_FUNCTION( glNormal3dv );
1266     DISABLE_GL_FUNCTION( glNormal3f );
1267     DISABLE_GL_FUNCTION( glNormal3fv );
1268     DISABLE_GL_FUNCTION( glNormal3i );
1269     DISABLE_GL_FUNCTION( glNormal3iv );
1270     DISABLE_GL_FUNCTION( glNormal3s );
1271     DISABLE_GL_FUNCTION( glNormal3sv );
1272     DISABLE_GL_FUNCTION( glNormalPointer );
1273     DISABLE_GL_FUNCTION( glOrtho );
1274     DISABLE_GL_FUNCTION( glPassThrough );
1275     DISABLE_GL_FUNCTION( glPixelMapfv );
1276     DISABLE_GL_FUNCTION( glPixelMapuiv );
1277     DISABLE_GL_FUNCTION( glPixelMapusv );
1278     DISABLE_GL_FUNCTION( glPixelStoref );
1279     DISABLE_GL_FUNCTION( glPixelStorei );
1280     DISABLE_GL_FUNCTION( glPixelTransferf );
1281     DISABLE_GL_FUNCTION( glPixelTransferi );
1282     DISABLE_GL_FUNCTION( glPixelZoom );
1283     DISABLE_GL_FUNCTION( glPointSize );
1284     DISABLE_GL_FUNCTION( glPolygonMode );
1285     DISABLE_GL_FUNCTION( glPolygonOffset );
1286     DISABLE_GL_FUNCTION( glPolygonStipple );
1287     DISABLE_GL_FUNCTION( glPopAttrib );
1288     DISABLE_GL_FUNCTION( glPopClientAttrib );
1289     DISABLE_GL_FUNCTION( glPopMatrix );
1290     DISABLE_GL_FUNCTION( glPopName );
1291     DISABLE_GL_FUNCTION( glPrioritizeTextures );
1292     DISABLE_GL_FUNCTION( glPushAttrib );
1293     DISABLE_GL_FUNCTION( glPushClientAttrib );
1294     DISABLE_GL_FUNCTION( glPushMatrix );
1295     DISABLE_GL_FUNCTION( glPushName );
1296     DISABLE_GL_FUNCTION( glRasterPos2d );
1297     DISABLE_GL_FUNCTION( glRasterPos2dv );
1298     DISABLE_GL_FUNCTION( glRasterPos2f );
1299     DISABLE_GL_FUNCTION( glRasterPos2fv );
1300     DISABLE_GL_FUNCTION( glRasterPos2i );
1301     DISABLE_GL_FUNCTION( glRasterPos2iv );
1302     DISABLE_GL_FUNCTION( glRasterPos2s );
1303     DISABLE_GL_FUNCTION( glRasterPos2sv );
1304     DISABLE_GL_FUNCTION( glRasterPos3d );
1305     DISABLE_GL_FUNCTION( glRasterPos3dv );
1306     DISABLE_GL_FUNCTION( glRasterPos3f );
1307     DISABLE_GL_FUNCTION( glRasterPos3fv );
1308     DISABLE_GL_FUNCTION( glRasterPos3i );
1309     DISABLE_GL_FUNCTION( glRasterPos3iv );
1310     DISABLE_GL_FUNCTION( glRasterPos3s );
1311     DISABLE_GL_FUNCTION( glRasterPos3sv );
1312     DISABLE_GL_FUNCTION( glRasterPos4d );
1313     DISABLE_GL_FUNCTION( glRasterPos4dv );
1314     DISABLE_GL_FUNCTION( glRasterPos4f );
1315     DISABLE_GL_FUNCTION( glRasterPos4fv );
1316     DISABLE_GL_FUNCTION( glRasterPos4i );
1317     DISABLE_GL_FUNCTION( glRasterPos4iv );
1318     DISABLE_GL_FUNCTION( glRasterPos4s );
1319     DISABLE_GL_FUNCTION( glRasterPos4sv );
1320     DISABLE_GL_FUNCTION( glReadBuffer );
1321     DISABLE_GL_FUNCTION( glReadPixels );
1322     DISABLE_GL_FUNCTION( glRectd );
1323     DISABLE_GL_FUNCTION( glRectdv );
1324     DISABLE_GL_FUNCTION( glRectf );
1325     DISABLE_GL_FUNCTION( glRectfv );
1326     DISABLE_GL_FUNCTION( glRecti );
1327     DISABLE_GL_FUNCTION( glRectiv );
1328     DISABLE_GL_FUNCTION( glRects );
1329     DISABLE_GL_FUNCTION( glRectsv );
1330     DISABLE_GL_FUNCTION( glRenderMode );
1331     DISABLE_GL_FUNCTION( glRotated );
1332     DISABLE_GL_FUNCTION( glRotatef );
1333     DISABLE_GL_FUNCTION( glScaled );
1334     DISABLE_GL_FUNCTION( glScalef );
1335     DISABLE_GL_FUNCTION( glScissor );
1336     DISABLE_GL_FUNCTION( glSelectBuffer );
1337     DISABLE_GL_FUNCTION( glShadeModel );
1338     DISABLE_GL_FUNCTION( glStencilFunc );
1339     DISABLE_GL_FUNCTION( glStencilMask );
1340     DISABLE_GL_FUNCTION( glStencilOp );
1341     DISABLE_GL_FUNCTION( glTexCoord1d );
1342     DISABLE_GL_FUNCTION( glTexCoord1dv );
1343     DISABLE_GL_FUNCTION( glTexCoord1f );
1344     DISABLE_GL_FUNCTION( glTexCoord1fv );
1345     DISABLE_GL_FUNCTION( glTexCoord1i );
1346     DISABLE_GL_FUNCTION( glTexCoord1iv );
1347     DISABLE_GL_FUNCTION( glTexCoord1s );
1348     DISABLE_GL_FUNCTION( glTexCoord1sv );
1349     DISABLE_GL_FUNCTION( glTexCoord2d );
1350     DISABLE_GL_FUNCTION( glTexCoord2dv );
1351     DISABLE_GL_FUNCTION( glTexCoord2f );
1352     DISABLE_GL_FUNCTION( glTexCoord2fv );
1353     DISABLE_GL_FUNCTION( glTexCoord2i );
1354     DISABLE_GL_FUNCTION( glTexCoord2iv );
1355     DISABLE_GL_FUNCTION( glTexCoord2s );
1356     DISABLE_GL_FUNCTION( glTexCoord2sv );
1357     DISABLE_GL_FUNCTION( glTexCoord3d );
1358     DISABLE_GL_FUNCTION( glTexCoord3dv );
1359     DISABLE_GL_FUNCTION( glTexCoord3f );
1360     DISABLE_GL_FUNCTION( glTexCoord3fv );
1361     DISABLE_GL_FUNCTION( glTexCoord3i );
1362     DISABLE_GL_FUNCTION( glTexCoord3iv );
1363     DISABLE_GL_FUNCTION( glTexCoord3s );
1364     DISABLE_GL_FUNCTION( glTexCoord3sv );
1365     DISABLE_GL_FUNCTION( glTexCoord4d );
1366     DISABLE_GL_FUNCTION( glTexCoord4dv );
1367     DISABLE_GL_FUNCTION( glTexCoord4f );
1368     DISABLE_GL_FUNCTION( glTexCoord4fv );
1369     DISABLE_GL_FUNCTION( glTexCoord4i );
1370     DISABLE_GL_FUNCTION( glTexCoord4iv );
1371     DISABLE_GL_FUNCTION( glTexCoord4s );
1372     DISABLE_GL_FUNCTION( glTexCoord4sv );
1373     DISABLE_GL_FUNCTION( glTexCoordPointer );
1374     DISABLE_GL_FUNCTION( glTexEnvf );
1375     DISABLE_GL_FUNCTION( glTexEnvfv );
1376     DISABLE_GL_FUNCTION( glTexEnvi );
1377     DISABLE_GL_FUNCTION( glTexEnviv );
1378     DISABLE_GL_FUNCTION( glTexGend );
1379     DISABLE_GL_FUNCTION( glTexGendv );
1380     DISABLE_GL_FUNCTION( glTexGenf );
1381     DISABLE_GL_FUNCTION( glTexGenfv );
1382     DISABLE_GL_FUNCTION( glTexGeni );
1383     DISABLE_GL_FUNCTION( glTexGeniv );
1384     DISABLE_GL_FUNCTION( glTexImage1D );
1385     DISABLE_GL_FUNCTION( glTexImage2D );
1386     DISABLE_GL_FUNCTION( glTexParameterf );
1387     DISABLE_GL_FUNCTION( glTexParameterfv );
1388     DISABLE_GL_FUNCTION( glTexParameteri );
1389     DISABLE_GL_FUNCTION( glTexParameteriv );
1390     DISABLE_GL_FUNCTION( glTexSubImage1D );
1391     DISABLE_GL_FUNCTION( glTexSubImage2D );
1392     DISABLE_GL_FUNCTION( glTranslated );
1393     DISABLE_GL_FUNCTION( glTranslatef );
1394     DISABLE_GL_FUNCTION( glVertex2d );
1395     DISABLE_GL_FUNCTION( glVertex2dv );
1396     DISABLE_GL_FUNCTION( glVertex2f );
1397     DISABLE_GL_FUNCTION( glVertex2fv );
1398     DISABLE_GL_FUNCTION( glVertex2i );
1399     DISABLE_GL_FUNCTION( glVertex2iv );
1400     DISABLE_GL_FUNCTION( glVertex2s );
1401     DISABLE_GL_FUNCTION( glVertex2sv );
1402     DISABLE_GL_FUNCTION( glVertex3d );
1403     DISABLE_GL_FUNCTION( glVertex3dv );
1404     DISABLE_GL_FUNCTION( glVertex3f );
1405     DISABLE_GL_FUNCTION( glVertex3fv );
1406     DISABLE_GL_FUNCTION( glVertex3i );
1407     DISABLE_GL_FUNCTION( glVertex3iv );
1408     DISABLE_GL_FUNCTION( glVertex3s );
1409     DISABLE_GL_FUNCTION( glVertex3sv );
1410     DISABLE_GL_FUNCTION( glVertex4d );
1411     DISABLE_GL_FUNCTION( glVertex4dv );
1412     DISABLE_GL_FUNCTION( glVertex4f );
1413     DISABLE_GL_FUNCTION( glVertex4fv );
1414     DISABLE_GL_FUNCTION( glVertex4i );
1415     DISABLE_GL_FUNCTION( glVertex4iv );
1416     DISABLE_GL_FUNCTION( glVertex4s );
1417     DISABLE_GL_FUNCTION( glVertex4sv );
1418     DISABLE_GL_FUNCTION( glVertexPointer );
1419     DISABLE_GL_FUNCTION( glViewport );
1420 
1421     DISABLE_GLS_FUNCTION( CopyContext );
1422     DISABLE_GLS_FUNCTION( CreateContext );
1423     DISABLE_GLS_FUNCTION( CreateLayerContext );
1424     DISABLE_GLS_FUNCTION( DeleteContext );
1425     DISABLE_GLS_FUNCTION( DescribeLayerPlane );
1426     DISABLE_GLS_FUNCTION( GetCurrentContext );
1427     DISABLE_GLS_FUNCTION( GetCurrentDC );
1428     DISABLE_GLS_FUNCTION( GetLayerPaletteEntries );
1429     DISABLE_GLS_FUNCTION( GetProcAddress );
1430     DISABLE_GLS_FUNCTION( MakeCurrent );
1431     DISABLE_GLS_FUNCTION( RealizeLayerPalette );
1432     DISABLE_GLS_FUNCTION( SetLayerPaletteEntries );
1433     DISABLE_GLS_FUNCTION( ShareLists );
1434     DISABLE_GLS_FUNCTION( SwapLayerBuffers );
1435     DISABLE_GLS_FUNCTION( UseFontBitmaps );
1436     DISABLE_GLS_FUNCTION( UseFontOutlines );
1437 
1438     DISABLE_GLS_FUNCTION( ChoosePixelFormat );
1439     DISABLE_GLS_FUNCTION( DescribePixelFormat );
1440     DISABLE_GLS_FUNCTION( GetPixelFormat );
1441     DISABLE_GLS_FUNCTION( SetPixelFormat );
1442     DISABLE_GLS_FUNCTION( SwapBuffers );
1443 
1444 #ifndef GLS_NO_GLU
1445 
1446     DISABLE_GLU_FUNCTION( gluBeginCurve );
1447     DISABLE_GLU_FUNCTION( gluBeginPolygon );
1448     DISABLE_GLU_FUNCTION( gluBeginSurface );
1449     DISABLE_GLU_FUNCTION( gluBeginTrim );
1450     DISABLE_GLU_FUNCTION( gluBuild1DMipmaps );
1451     DISABLE_GLU_FUNCTION( gluBuild2DMipmaps );
1452     DISABLE_GLU_FUNCTION( gluCylinder );
1453     DISABLE_GLU_FUNCTION( gluDeleteNurbsRenderer );
1454     DISABLE_GLU_FUNCTION( gluDeleteQuadric );
1455     DISABLE_GLU_FUNCTION( gluDeleteTess );
1456     DISABLE_GLU_FUNCTION( gluDisk );
1457     DISABLE_GLU_FUNCTION( gluEndCurve );
1458     DISABLE_GLU_FUNCTION( gluEndPolygon );
1459     DISABLE_GLU_FUNCTION( gluEndSurface );
1460     DISABLE_GLU_FUNCTION( gluEndTrim );
1461     DISABLE_GLU_FUNCTION( gluErrorString );
1462     DISABLE_GLU_FUNCTION( gluGetNurbsProperty );
1463     DISABLE_GLU_FUNCTION( gluGetString );
1464     DISABLE_GLU_FUNCTION( gluGetTessProperty );
1465     DISABLE_GLU_FUNCTION( gluLoadSamplingMatrices );
1466     DISABLE_GLU_FUNCTION( gluLookAt );
1467     DISABLE_GLU_FUNCTION( gluNewNurbsRenderer );
1468     DISABLE_GLU_FUNCTION( gluNewQuadric );
1469     DISABLE_GLU_FUNCTION( gluNewTess );
1470     DISABLE_GLU_FUNCTION( gluNextContour );
1471     DISABLE_GLU_FUNCTION( gluNurbsCallback );
1472     DISABLE_GLU_FUNCTION( gluNurbsCurve );
1473     DISABLE_GLU_FUNCTION( gluNurbsProperty );
1474     DISABLE_GLU_FUNCTION( gluNurbsSurface );
1475     DISABLE_GLU_FUNCTION( gluOrtho2D );
1476     DISABLE_GLU_FUNCTION( gluPartialDisk );
1477     DISABLE_GLU_FUNCTION( gluPerspective );
1478     DISABLE_GLU_FUNCTION( gluPickMatrix );
1479     DISABLE_GLU_FUNCTION( gluProject );
1480     DISABLE_GLU_FUNCTION( gluPwlCurve );
1481     DISABLE_GLU_FUNCTION( gluQuadricCallback );
1482     DISABLE_GLU_FUNCTION( gluQuadricDrawStyle );
1483     DISABLE_GLU_FUNCTION( gluQuadricNormals );
1484     DISABLE_GLU_FUNCTION( gluQuadricOrientation );
1485     DISABLE_GLU_FUNCTION( gluQuadricTexture );
1486     DISABLE_GLU_FUNCTION( gluScaleImage );
1487     DISABLE_GLU_FUNCTION( gluSphere );
1488     DISABLE_GLU_FUNCTION( gluTessBeginContour );
1489     DISABLE_GLU_FUNCTION( gluTessBeginPolygon );
1490     DISABLE_GLU_FUNCTION( gluTessCallback );
1491     DISABLE_GLU_FUNCTION( gluTessEndContour );
1492     DISABLE_GLU_FUNCTION( gluTessEndPolygon );
1493     DISABLE_GLU_FUNCTION( gluTessNormal );
1494     DISABLE_GLU_FUNCTION( gluTessProperty );
1495     DISABLE_GLU_FUNCTION( gluTessVertex );
1496     DISABLE_GLU_FUNCTION( gluUnProject );
1497 
1498 #endif  /* GLS_NO_GLU */
1499 
1500 #undef DISABLE_GL_FUNCTION
1501 #undef DISABLE_GLS_FUNCTION
1502 #undef DISABLE_GLU_FUNCTION
1503 
1504     _glsGLDriverFilePath[0] = 0;
1505     _glsGLUDriverFilePath[0] = 0;
1506     _glsLoadedDriverIndex = GLS_INVALID_DRIVER_INDEX;
1507 }
1508 
1509 /*----------------------------------------------------------------------------
1510 
1511 internal utility functions
1512 
1513 */
1514 
_glsGetEnv(char const * pEnv)1515 GLS_STATIC char const *_glsGetEnv( char const *pEnv )
1516 {
1517     return getenv(pEnv);
1518 }
_glsSetEnv(char const * pEnv,char const * pValue)1519 GLS_STATIC void _glsSetEnv( char const *pEnv, char const *pValue )
1520 {
1521     /* it's not terribly important that this succeed */
1522 
1523     char aBuffer[256];
1524     int unsigned EnvLength, ValueLength = 0;
1525     assert(pEnv);
1526     EnvLength = (int) strlen(pEnv);
1527     if(pValue)
1528     {
1529         ValueLength = (int) strlen(pValue);
1530     }
1531     if((EnvLength + 1 + ValueLength) < sizeof(aBuffer))
1532     {
1533         sprintf(aBuffer,"%s=%s",pEnv,pValue ? pValue : "");
1534         _putenv(aBuffer);
1535     }
1536 }
1537 
_glsGetRegistryDWORD(HKEY Root,char const * pKey,char const * pValue,DWORD Default)1538 GLS_STATIC DWORD _glsGetRegistryDWORD( HKEY Root, char const *pKey,
1539                                        char const *pValue, DWORD Default )
1540 {
1541     /* it's not terribly important that this succeed */
1542 
1543     HKEY Key = (HKEY)INVALID_HANDLE_VALUE;
1544     DWORD Value = Default, SizeOfValue = sizeof(Value);
1545     DWORD Type = REG_DWORD;
1546 
1547     if(RegOpenKeyEx(Root,pKey,0,KEY_QUERY_VALUE,&Key) == ERROR_SUCCESS)
1548     {
1549         RegQueryValueEx(Key,pValue,0,&Type,(BYTE*)&Value,&SizeOfValue);
1550         RegCloseKey(Key);
1551     }
1552 
1553     return Value;
1554 }
_glsSetRegistryDWORD(HKEY Root,char const * pKey,char const * pValue,DWORD Value)1555 GLS_STATIC void _glsSetRegistryDWORD( HKEY Root, char const *pKey,
1556                                       char const *pValue, DWORD Value )
1557 {
1558     /* it's not terribly important that this succeed */
1559 
1560     HKEY Key = (HKEY)INVALID_HANDLE_VALUE;
1561     DWORD Disposition;
1562 
1563     if(RegCreateKeyEx(Root,pKey,0,0,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,0,
1564                    &Key,&Disposition) == ERROR_SUCCESS)
1565     {
1566         RegSetValueEx(Key,pValue,0,REG_DWORD,(BYTE*)&Value,sizeof(Value));
1567         RegCloseKey(Key);
1568     }
1569 }
1570 
_glsGetDriverFileDate(char const * pDriverFilePath,gls_driver_file_info * pDriverFileInfo)1571 GLS_STATIC BOOL _glsGetDriverFileDate( char const *pDriverFilePath,
1572                                        gls_driver_file_info *pDriverFileInfo )
1573 {
1574     BOOL ReturnValue = FALSE;
1575     BY_HANDLE_FILE_INFORMATION FileInformation;
1576     HANDLE FileHandle;
1577     assert(pDriverFilePath && pDriverFileInfo);
1578 
1579     pDriverFileInfo->DriverFileDateHigh =
1580         pDriverFileInfo->DriverFileDateLow = 0;
1581 
1582     FileHandle = CreateFile(pDriverFilePath,GENERIC_READ,
1583                             FILE_SHARE_READ,0,OPEN_EXISTING,
1584                             FILE_ATTRIBUTE_NORMAL,0);
1585 
1586     if(FileHandle != INVALID_HANDLE_VALUE)
1587     {
1588         if(GetFileInformationByHandle(FileHandle,&FileInformation))
1589         {
1590             pDriverFileInfo->DriverFileDateHigh =
1591                 FileInformation.ftLastWriteTime.dwHighDateTime;
1592             pDriverFileInfo->DriverFileDateLow =
1593                 FileInformation.ftLastWriteTime.dwLowDateTime;
1594 
1595             ReturnValue = TRUE;
1596         }
1597         CloseHandle(FileHandle);
1598     }
1599     return ReturnValue;
1600 }
1601 
_glsGetVersionString(BYTE const * pVersionInfo,char const * pVersionString,UINT * pStringSize)1602 GLS_STATIC char const *_glsGetVersionString( BYTE const *pVersionInfo,
1603                                              char const *pVersionString,
1604                                              UINT *pStringSize )
1605 {
1606     /* we have to try a few different code pages because we don't
1607        know how to read the version strings in the correct language */
1608     /* @todo figure out how to read them correctly */
1609     /* @todo do we want to use the 0000 code page? */
1610 
1611     DWORD aCodePages[] = { 1200, 1252 };
1612 #define NUMBER_OF_CODE_PAGES (sizeof(aCodePages)/sizeof(aCodePages[0]))
1613     int CodePageIndex;
1614     BOOL DebugValue;
1615     char *pString = 0;
1616     *pStringSize = 0;
1617 
1618     assert(pVersionInfo && pVersionString && pStringSize);
1619 
1620     for(CodePageIndex = 0;
1621         (CodePageIndex < NUMBER_OF_CODE_PAGES) && !pString;
1622         CodePageIndex++)
1623     {
1624         char aQueryString[1024];
1625 
1626         /* @todo this is not a very maintainable way of doing this */
1627         /* strlen("\StringFileInfo\12341234\") == 25               */
1628         if(sizeof(aQueryString) > (25 + strlen(pVersionString)))
1629         {
1630             sprintf(aQueryString,"\\StringFileInfo\\%04X%04X\\%s",
1631                     GetUserDefaultLangID(),aCodePages[CodePageIndex],
1632                     pVersionString);
1633 
1634             DebugValue = VerQueryValue((BYTE *)pVersionInfo,aQueryString,
1635                                        (void **)&pString,pStringSize);
1636 
1637             assert((DebugValue && pString && *pStringSize)
1638                    || (!DebugValue && !pString && !*pStringSize));
1639         }
1640     }
1641 #undef NUMBER_OF_CODE_PAGES
1642 
1643     return pString;
1644 }
1645 
_glsGetDriverFileVersion(char const * pDriverFilePath,gls_driver_file_info * pDriverFileInfo,char * pDescription,int unsigned DescriptionLength)1646 GLS_STATIC BOOL _glsGetDriverFileVersion( char const *pDriverFilePath,
1647                                           gls_driver_file_info *pDriverFileInfo,
1648                                           char *pDescription,
1649                                           int unsigned DescriptionLength )
1650 {
1651     BOOL ReturnValue = FALSE;
1652     DWORD dummy;     /* Windows rules */
1653     DWORD VersionSize;
1654     assert(pDriverFilePath && pDriverFileInfo);
1655     VersionSize = GetFileVersionInfoSize((char *)pDriverFilePath,&dummy);
1656 
1657     pDriverFileInfo->DriverFileVersionHigh =
1658         pDriverFileInfo->DriverFileVersionLow = 0;
1659     if(pDescription && DescriptionLength)
1660     {
1661         pDescription[0] = 0;
1662     }
1663 
1664     if(VersionSize)
1665     {
1666         BYTE *pTempVersionInfo = (BYTE *)malloc(VersionSize);
1667         if(pTempVersionInfo)
1668         {
1669             if(GetFileVersionInfo((char *)pDriverFilePath,0,VersionSize,
1670                                   pTempVersionInfo))
1671             {
1672                 VS_FIXEDFILEINFO *pTempFixedInfo;
1673                 int unsigned FixedInfoLength;
1674 
1675                 /* first, get the fixed version info */
1676 
1677                 if((VerQueryValue(pTempVersionInfo,"\\",
1678                                   (void **)&pTempFixedInfo,
1679                                   &FixedInfoLength))
1680                    && (FixedInfoLength == sizeof(*pTempFixedInfo))
1681                    && pTempFixedInfo
1682                    && (pTempFixedInfo->dwSignature == 0xFEEF04BD))
1683                 {
1684                     assert(pTempFixedInfo);
1685 
1686                     pDriverFileInfo->DriverFileVersionHigh =
1687                         pTempFixedInfo->dwFileVersionMS;
1688                     pDriverFileInfo->DriverFileVersionLow =
1689                         pTempFixedInfo->dwFileVersionLS;
1690 
1691                     ReturnValue = TRUE;
1692                 }
1693 
1694                 /* now try for the string description, not caring if we fail */
1695 
1696                 if(pDescription && DescriptionLength)
1697                 {
1698                     UINT CompanyNameLength, FileDescriptionLength,
1699                         ProductNameLength;
1700                     char const *pCompanyName, *pFileDescription,
1701                         *pProductName;
1702 
1703                     pCompanyName = _glsGetVersionString(pTempVersionInfo,
1704                                                         "CompanyName",
1705                                                         &CompanyNameLength);
1706 
1707                     pFileDescription = _glsGetVersionString(pTempVersionInfo,
1708                                                             "FileDescription",
1709                                                             &FileDescriptionLength);
1710 
1711                     pProductName = _glsGetVersionString(pTempVersionInfo,
1712                                                         "ProductName",
1713                                                         &ProductNameLength);
1714 
1715                     /* see if the string will fit, including the " - " */
1716                     if(DescriptionLength >
1717                        (CompanyNameLength + 3 + max(ProductNameLength,
1718                                                     FileDescriptionLength)))
1719                     {
1720                         /* we're going to create a string something like this:
1721                            "CompanyName - FileDescription", but with everything
1722                            optional, choosing FileDescription over ProductName */
1723 
1724                         sprintf(pDescription,"%s%s%s",
1725                                 (pCompanyName ? pCompanyName : ""),
1726                                 ((pCompanyName && (pFileDescription ||
1727                                                    pProductName)) ? " - " : ""),
1728                                 (pFileDescription ? pFileDescription :
1729                                  (pProductName ? pProductName : "")));
1730                     }
1731                 }
1732             }
1733             free(pTempVersionInfo);
1734         }
1735     }
1736     return ReturnValue;
1737 }
1738 
_glsCopyPathCheckSystemDirectory(char const * pDriverFilePath,gls_driver_file_info * pDriverFileInfo,BOOL * pIsInSystemDir)1739 GLS_STATIC BOOL _glsCopyPathCheckSystemDirectory( char const *pDriverFilePath,
1740                                                   gls_driver_file_info *pDriverFileInfo,
1741                                                   BOOL *pIsInSystemDir )
1742 {
1743     BOOL ReturnValue = FALSE;
1744     char aSystemDir[MAX_PATH];
1745     char *pFilePart;
1746     int PathLength, SystemLength;
1747 
1748     assert(pDriverFilePath && pDriverFileInfo);
1749 
1750     pDriverFileInfo->aDriverFilePath[0] = 0;
1751     if(pIsInSystemDir)
1752     {
1753         *pIsInSystemDir = FALSE;
1754     }
1755 
1756     if(GetFullPathName(pDriverFilePath,sizeof(pDriverFileInfo->aDriverFilePath),
1757                        pDriverFileInfo->aDriverFilePath,&pFilePart)
1758        && GetSystemDirectory(aSystemDir,sizeof(aSystemDir)))
1759     {
1760         PathLength = (int) (pFilePart - pDriverFileInfo->aDriverFilePath);
1761         strlwr(pDriverFileInfo->aDriverFilePath);
1762         SystemLength = (int) strlen(aSystemDir);
1763         strlwr(aSystemDir);
1764 
1765         /* PathLength is going to include the \, SystemLength is not */
1766         if(pIsInSystemDir && ((PathLength-1) == SystemLength)
1767            && (strstr(pDriverFileInfo->aDriverFilePath,aSystemDir) ==
1768                pDriverFileInfo->aDriverFilePath))
1769         {
1770             *pIsInSystemDir = TRUE;
1771         }
1772         ReturnValue = TRUE;
1773     }
1774     return ReturnValue;
1775 }
1776 
_glsIsDefaultOpenGL(char const * pGLDriverFilePath)1777 GLS_STATIC BOOL _glsIsDefaultOpenGL( char const *pGLDriverFilePath )
1778 {
1779     BOOL ReturnValue = FALSE;
1780     char aTempPath[MAX_PATH], aDriverPath[MAX_PATH], aDefaultPath[MAX_PATH];
1781     char *pFilePart;
1782 
1783     assert(pGLDriverFilePath);
1784 
1785     /* construct default path */
1786 
1787     GetSystemDirectory(aTempPath,sizeof(aTempPath));
1788     strcat(aTempPath,"\\opengl32.dll");
1789     GetFullPathName(aTempPath,sizeof(aDefaultPath),aDefaultPath,
1790                     &pFilePart);
1791 
1792     /* @todo what about .dll, it's optional? */
1793 
1794     if(GetFullPathName(pGLDriverFilePath,sizeof(aDriverPath),aDriverPath,
1795                        &pFilePart))
1796     {
1797         if(!stricmp(aDriverPath,aDefaultPath))
1798         {
1799             ReturnValue = TRUE;
1800         }
1801     }
1802     return ReturnValue;
1803 }
1804 
_glsCompareDirectories(char const * pA,char const * pB)1805 GLS_STATIC BOOL _glsCompareDirectories( char const *pA, char const *pB )
1806 {
1807     BOOL ReturnValue = FALSE;
1808     char aA[MAX_PATH], aB[MAX_PATH];
1809     char *pAFile = 0, *pBFile = 0;
1810 
1811     assert(pA && pB);
1812 
1813     GetFullPathName(pA,sizeof(aA),aA,&pAFile);
1814     GetFullPathName(pB,sizeof(aB),aB,&pBFile);
1815 
1816     if(pAFile)
1817     {
1818         *pAFile = 0;
1819     }
1820     if(pBFile)
1821     {
1822         *pBFile = 0;
1823     }
1824 
1825     if(!stricmp(aA,aB))
1826     {
1827         ReturnValue = TRUE;
1828     }
1829     return ReturnValue;
1830 }
1831 
1832 
1833 /*----------------------------------------------------------------------------
1834   ----------------------------------------------------------------------------
1835   ----------------------------------------------------------------------------
1836 
1837 Below are the definitions of the function pointers for the binding library.
1838 
1839 */
1840 
1841 
1842 /*----------------------------------------------------------------------------
1843   ----------------------------------------------------------------------------
1844   ----------------------------------------------------------------------------
1845 
1846 First come the wgl function pointers.
1847 
1848 The first three functions, ChoosePixelFormat, DescribePixelFormat, and
1849 SetPixelFormat are defined to point to stub functions that will
1850 initialize gls to the default driver by calling glsLoadDriver(0)
1851 first.
1852 
1853 */
1854 
_glsChoosePixelFormat_default(HDC h,CONST PIXELFORMATDESCRIPTOR * p)1855 GLS_STATIC int WINAPI _glsChoosePixelFormat_default( HDC h, CONST PIXELFORMATDESCRIPTOR *p )
1856 {
1857     if(!_glsGLDriverHandle)
1858     {
1859         glsLoadDriver(0);
1860     }
1861     return glsChoosePixelFormat(h,p);
1862 }
1863 int   ( WINAPI * GLS_CONST GLS_SCOPE_NAME( ChoosePixelFormat ))(HDC, CONST PIXELFORMATDESCRIPTOR *) = &_glsChoosePixelFormat_default;
1864 
_glsDescribePixelFormat_default(HDC h,int i,UINT u,LPPIXELFORMATDESCRIPTOR p)1865 GLS_STATIC int WINAPI _glsDescribePixelFormat_default(HDC h, int i, UINT u, LPPIXELFORMATDESCRIPTOR p)
1866 {
1867     if(!_glsGLDriverHandle)
1868     {
1869         glsLoadDriver(0);
1870     }
1871     return glsDescribePixelFormat(h,i,u,p);
1872 }
1873 int   ( WINAPI * GLS_CONST GLS_SCOPE_NAME( DescribePixelFormat )) (HDC, int, UINT, LPPIXELFORMATDESCRIPTOR) = &_glsDescribePixelFormat_default;
1874 
_glsSetPixelFormat_default(HDC h,int i,CONST PIXELFORMATDESCRIPTOR * p)1875 GLS_STATIC BOOL WINAPI _glsSetPixelFormat_default(HDC h, int i, CONST PIXELFORMATDESCRIPTOR *p )
1876 {
1877     if(!_glsGLDriverHandle)
1878     {
1879         glsLoadDriver(0);
1880     }
1881     return glsSetPixelFormat(h,i,p);
1882 }
1883 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SetPixelFormat ))(HDC, int, CONST PIXELFORMATDESCRIPTOR *) = &_glsSetPixelFormat_default;
1884 
1885 int   ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetPixelFormat ))(HDC) = 0;
1886 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SwapBuffers ))(HDC) = 0;
1887 
_glsGetCurrentContext_default(VOID)1888 HGLRC WINAPI _glsGetCurrentContext_default(VOID)
1889 {
1890     if(!_glsGLDriverHandle)
1891     {
1892         glsLoadDriver(0);
1893     }
1894     return glsGetCurrentContext();
1895 }
1896 HGLRC ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetCurrentContext ))(VOID) = _glsGetCurrentContext_default;
1897 
1898 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( CopyContext ))(HGLRC, HGLRC, UINT) = 0;
1899 HGLRC ( WINAPI * GLS_CONST GLS_SCOPE_NAME( CreateContext ))(HDC) = 0;
1900 HGLRC ( WINAPI * GLS_CONST GLS_SCOPE_NAME( CreateLayerContext ))(HDC, int) = 0;
1901 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( DeleteContext ))(HGLRC) = 0;
1902 HDC   ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetCurrentDC ))(VOID) = 0;
1903 PROC  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetProcAddress ))(LPCSTR) = 0;
1904 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( MakeCurrent ))(HDC, HGLRC) = 0;
1905 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( ShareLists ))(HGLRC, HGLRC) = 0;
1906 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( UseFontBitmaps ))(HDC, DWORD, DWORD, DWORD) = 0;
1907 
1908 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( UseFontOutlines ))(HDC, DWORD, DWORD, DWORD, FLOAT,
1909                                            FLOAT, int, LPGLYPHMETRICSFLOAT) = 0;
1910 
1911 BOOL ( WINAPI * GLS_CONST GLS_SCOPE_NAME( DescribeLayerPlane ))(HDC, int, int, UINT,
1912                                             LPLAYERPLANEDESCRIPTOR) = 0;
1913 int  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SetLayerPaletteEntries ))(HDC, int, int, int,
1914                                                 CONST COLORREF *) = 0;
1915 int  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetLayerPaletteEntries ))(HDC, int, int, int,
1916                                                 COLORREF *) = 0;
1917 BOOL ( WINAPI * GLS_CONST GLS_SCOPE_NAME( RealizeLayerPalette ))(HDC, int, BOOL) = 0;
1918 BOOL ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SwapLayerBuffers ))(HDC, UINT) = 0;
1919 
1920 /*----------------------------------------------------------------------------
1921   ----------------------------------------------------------------------------
1922   ----------------------------------------------------------------------------
1923 
1924 wgl extension function pointers.
1925 
1926 */
1927 
1928 int   ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SwapIntervalEXT ))( int interval ) = 0;
1929 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( GetDeviceGammaRamp3DFX ))( HDC, LPVOID ) = 0;
1930 BOOL  ( WINAPI * GLS_CONST GLS_SCOPE_NAME( SetDeviceGammaRamp3DFX ))( HDC, LPVOID ) = 0;
1931 
1932 /*----------------------------------------------------------------------------
1933   ----------------------------------------------------------------------------
1934   ----------------------------------------------------------------------------
1935 
1936 Core OpenGL function pointers.
1937 
1938 */
1939 
1940 void ( APIENTRY * GLS_CONST glAccum )(GLenum op, GLfloat value) = 0;
1941 void ( APIENTRY * GLS_CONST glAlphaFunc )(GLenum func, GLclampf ref) = 0;
1942 GLboolean ( APIENTRY * GLS_CONST glAreTexturesResident )(GLsizei n, const GLuint *textures, GLboolean *residences) = 0;
1943 void ( APIENTRY * GLS_CONST glArrayElement )(GLint i) = 0;
1944 void ( APIENTRY * GLS_CONST glBegin )(GLenum mode) = 0;
1945 void ( APIENTRY * GLS_CONST glBindTexture )(GLenum target, GLuint texture) = 0;
1946 void ( APIENTRY * GLS_CONST glBitmap )(GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap) = 0;
1947 void ( APIENTRY * GLS_CONST glBlendFunc )(GLenum sfactor, GLenum dfactor) = 0;
1948 void ( APIENTRY * GLS_CONST glCallList )(GLuint list) = 0;
1949 void ( APIENTRY * GLS_CONST glCallLists )(GLsizei n, GLenum type, const GLvoid *lists) = 0;
1950 void ( APIENTRY * GLS_CONST glClear )(GLbitfield mask) = 0;
1951 void ( APIENTRY * GLS_CONST glClearAccum )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = 0;
1952 void ( APIENTRY * GLS_CONST glClearColor )(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) = 0;
1953 void ( APIENTRY * GLS_CONST glClearDepth )(GLclampd depth) = 0;
1954 void ( APIENTRY * GLS_CONST glClearIndex )(GLfloat c) = 0;
1955 void ( APIENTRY * GLS_CONST glClearStencil )(GLint s) = 0;
1956 void ( APIENTRY * GLS_CONST glClipPlane )(GLenum plane, const GLdouble *equation) = 0;
1957 void ( APIENTRY * GLS_CONST glColor3b )(GLbyte red, GLbyte green, GLbyte blue) = 0;
1958 void ( APIENTRY * GLS_CONST glColor3bv )(const GLbyte *v) = 0;
1959 void ( APIENTRY * GLS_CONST glColor3d )(GLdouble red, GLdouble green, GLdouble blue) = 0;
1960 void ( APIENTRY * GLS_CONST glColor3dv )(const GLdouble *v) = 0;
1961 void ( APIENTRY * GLS_CONST glColor3f )(GLfloat red, GLfloat green, GLfloat blue) = 0;
1962 void ( APIENTRY * GLS_CONST glColor3fv )(const GLfloat *v) = 0;
1963 void ( APIENTRY * GLS_CONST glColor3i )(GLint red, GLint green, GLint blue) = 0;
1964 void ( APIENTRY * GLS_CONST glColor3iv )(const GLint *v) = 0;
1965 void ( APIENTRY * GLS_CONST glColor3s )(GLshort red, GLshort green, GLshort blue) = 0;
1966 void ( APIENTRY * GLS_CONST glColor3sv )(const GLshort *v) = 0;
1967 void ( APIENTRY * GLS_CONST glColor3ub )(GLubyte red, GLubyte green, GLubyte blue) = 0;
1968 void ( APIENTRY * GLS_CONST glColor3ubv )(const GLubyte *v) = 0;
1969 void ( APIENTRY * GLS_CONST glColor3ui )(GLuint red, GLuint green, GLuint blue) = 0;
1970 void ( APIENTRY * GLS_CONST glColor3uiv )(const GLuint *v) = 0;
1971 void ( APIENTRY * GLS_CONST glColor3us )(GLushort red, GLushort green, GLushort blue) = 0;
1972 void ( APIENTRY * GLS_CONST glColor3usv )(const GLushort *v) = 0;
1973 void ( APIENTRY * GLS_CONST glColor4b )(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha) = 0;
1974 void ( APIENTRY * GLS_CONST glColor4bv )(const GLbyte *v) = 0;
1975 void ( APIENTRY * GLS_CONST glColor4d )(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha) = 0;
1976 void ( APIENTRY * GLS_CONST glColor4dv )(const GLdouble *v) = 0;
1977 void ( APIENTRY * GLS_CONST glColor4f )(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) = 0;
1978 void ( APIENTRY * GLS_CONST glColor4fv )(const GLfloat *v) = 0;
1979 void ( APIENTRY * GLS_CONST glColor4i )(GLint red, GLint green, GLint blue, GLint alpha) = 0;
1980 void ( APIENTRY * GLS_CONST glColor4iv )(const GLint *v) = 0;
1981 void ( APIENTRY * GLS_CONST glColor4s )(GLshort red, GLshort green, GLshort blue, GLshort alpha) = 0;
1982 void ( APIENTRY * GLS_CONST glColor4sv )(const GLshort *v) = 0;
1983 void ( APIENTRY * GLS_CONST glColor4ub )(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha) = 0;
1984 void ( APIENTRY * GLS_CONST glColor4ubv )(const GLubyte *v) = 0;
1985 void ( APIENTRY * GLS_CONST glColor4ui )(GLuint red, GLuint green, GLuint blue, GLuint alpha) = 0;
1986 void ( APIENTRY * GLS_CONST glColor4uiv )(const GLuint *v) = 0;
1987 void ( APIENTRY * GLS_CONST glColor4us )(GLushort red, GLushort green, GLushort blue, GLushort alpha) = 0;
1988 void ( APIENTRY * GLS_CONST glColor4usv )(const GLushort *v) = 0;
1989 void ( APIENTRY * GLS_CONST glColorMask )(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) = 0;
1990 void ( APIENTRY * GLS_CONST glColorMaterial )(GLenum face, GLenum mode) = 0;
1991 void ( APIENTRY * GLS_CONST glColorPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = 0;
1992 void ( APIENTRY * GLS_CONST glCopyPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type) = 0;
1993 void ( APIENTRY * GLS_CONST glCopyTexImage1D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border) = 0;
1994 void ( APIENTRY * GLS_CONST glCopyTexImage2D )(GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) = 0;
1995 void ( APIENTRY * GLS_CONST glCopyTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width) = 0;
1996 void ( APIENTRY * GLS_CONST glCopyTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) = 0;
1997 void ( APIENTRY * GLS_CONST glCullFace )(GLenum mode) = 0;
1998 void ( APIENTRY * GLS_CONST glDeleteLists )(GLuint list, GLsizei range) = 0;
1999 void ( APIENTRY * GLS_CONST glDeleteTextures )(GLsizei n, const GLuint *textures) = 0;
2000 void ( APIENTRY * GLS_CONST glDepthFunc )(GLenum func) = 0;
2001 void ( APIENTRY * GLS_CONST glDepthMask )(GLboolean flag) = 0;
2002 void ( APIENTRY * GLS_CONST glDepthRange )(GLclampd zNear, GLclampd zFar) = 0;
2003 void ( APIENTRY * GLS_CONST glDisable )(GLenum cap) = 0;
2004 void ( APIENTRY * GLS_CONST glDisableClientState )(GLenum array) = 0;
2005 void ( APIENTRY * GLS_CONST glDrawArrays )(GLenum mode, GLint first, GLsizei count) = 0;
2006 void ( APIENTRY * GLS_CONST glDrawBuffer )(GLenum mode) = 0;
2007 void ( APIENTRY * GLS_CONST glDrawElements )(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices) = 0;
2008 void ( APIENTRY * GLS_CONST glDrawPixels )(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) = 0;
2009 void ( APIENTRY * GLS_CONST glEdgeFlag )(GLboolean flag) = 0;
2010 void ( APIENTRY * GLS_CONST glEdgeFlagPointer )(GLsizei stride, const GLvoid *pointer) = 0;
2011 void ( APIENTRY * GLS_CONST glEdgeFlagv )(const GLboolean *flag) = 0;
2012 void ( APIENTRY * GLS_CONST glEnable )(GLenum cap) = 0;
2013 void ( APIENTRY * GLS_CONST glEnableClientState )(GLenum array) = 0;
2014 void ( APIENTRY * GLS_CONST glEnd )(void) = 0;
2015 void ( APIENTRY * GLS_CONST glEndList )(void) = 0;
2016 void ( APIENTRY * GLS_CONST glEvalCoord1d )(GLdouble u) = 0;
2017 void ( APIENTRY * GLS_CONST glEvalCoord1dv )(const GLdouble *u) = 0;
2018 void ( APIENTRY * GLS_CONST glEvalCoord1f )(GLfloat u) = 0;
2019 void ( APIENTRY * GLS_CONST glEvalCoord1fv )(const GLfloat *u) = 0;
2020 void ( APIENTRY * GLS_CONST glEvalCoord2d )(GLdouble u, GLdouble v) = 0;
2021 void ( APIENTRY * GLS_CONST glEvalCoord2dv )(const GLdouble *u) = 0;
2022 void ( APIENTRY * GLS_CONST glEvalCoord2f )(GLfloat u, GLfloat v) = 0;
2023 void ( APIENTRY * GLS_CONST glEvalCoord2fv )(const GLfloat *u) = 0;
2024 void ( APIENTRY * GLS_CONST glEvalMesh1 )(GLenum mode, GLint i1, GLint i2) = 0;
2025 void ( APIENTRY * GLS_CONST glEvalMesh2 )(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2) = 0;
2026 void ( APIENTRY * GLS_CONST glEvalPoint1 )(GLint i) = 0;
2027 void ( APIENTRY * GLS_CONST glEvalPoint2 )(GLint i, GLint j) = 0;
2028 void ( APIENTRY * GLS_CONST glFeedbackBuffer )(GLsizei size, GLenum type, GLfloat *buffer) = 0;
2029 void ( APIENTRY * GLS_CONST glFinish )(void) = 0;
2030 void ( APIENTRY * GLS_CONST glFlush )(void) = 0;
2031 void ( APIENTRY * GLS_CONST glFogf )(GLenum pname, GLfloat param) = 0;
2032 void ( APIENTRY * GLS_CONST glFogfv )(GLenum pname, const GLfloat *params) = 0;
2033 void ( APIENTRY * GLS_CONST glFogi )(GLenum pname, GLint param) = 0;
2034 void ( APIENTRY * GLS_CONST glFogiv )(GLenum pname, const GLint *params) = 0;
2035 void ( APIENTRY * GLS_CONST glFrontFace )(GLenum mode) = 0;
2036 void ( APIENTRY * GLS_CONST glFrustum )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) = 0;
2037 GLuint ( APIENTRY * GLS_CONST glGenLists )(GLsizei range) = 0;
2038 void ( APIENTRY * GLS_CONST glGenTextures )(GLsizei n, GLuint *textures) = 0;
2039 void ( APIENTRY * GLS_CONST glGetBooleanv )(GLenum pname, GLboolean *params) = 0;
2040 void ( APIENTRY * GLS_CONST glGetClipPlane )(GLenum plane, GLdouble *equation) = 0;
2041 void ( APIENTRY * GLS_CONST glGetDoublev )(GLenum pname, GLdouble *params) = 0;
2042 GLenum ( APIENTRY * GLS_CONST glGetError )(void) = 0;
2043 void ( APIENTRY * GLS_CONST glGetFloatv )(GLenum pname, GLfloat *params) = 0;
2044 void ( APIENTRY * GLS_CONST glGetIntegerv )(GLenum pname, GLint *params) = 0;
2045 void ( APIENTRY * GLS_CONST glGetLightfv )(GLenum light, GLenum pname, GLfloat *params) = 0;
2046 void ( APIENTRY * GLS_CONST glGetLightiv )(GLenum light, GLenum pname, GLint *params) = 0;
2047 void ( APIENTRY * GLS_CONST glGetMapdv )(GLenum target, GLenum query, GLdouble *v) = 0;
2048 void ( APIENTRY * GLS_CONST glGetMapfv )(GLenum target, GLenum query, GLfloat *v) = 0;
2049 void ( APIENTRY * GLS_CONST glGetMapiv )(GLenum target, GLenum query, GLint *v) = 0;
2050 void ( APIENTRY * GLS_CONST glGetMaterialfv )(GLenum face, GLenum pname, GLfloat *params) = 0;
2051 void ( APIENTRY * GLS_CONST glGetMaterialiv )(GLenum face, GLenum pname, GLint *params) = 0;
2052 void ( APIENTRY * GLS_CONST glGetPixelMapfv )(GLenum map, GLfloat *values) = 0;
2053 void ( APIENTRY * GLS_CONST glGetPixelMapuiv )(GLenum map, GLuint *values) = 0;
2054 void ( APIENTRY * GLS_CONST glGetPixelMapusv )(GLenum map, GLushort *values) = 0;
2055 void ( APIENTRY * GLS_CONST glGetPointerv )(GLenum pname, GLvoid* *params) = 0;
2056 void ( APIENTRY * GLS_CONST glGetPolygonStipple )(GLubyte *mask) = 0;
2057 const GLubyte * const ( APIENTRY * GLS_CONST glGetString )(GLenum name) = 0;
2058 void ( APIENTRY * GLS_CONST glGetTexEnvfv )(GLenum target, GLenum pname, GLfloat *params) = 0;
2059 void ( APIENTRY * GLS_CONST glGetTexEnviv )(GLenum target, GLenum pname, GLint *params) = 0;
2060 void ( APIENTRY * GLS_CONST glGetTexGendv )(GLenum coord, GLenum pname, GLdouble *params) = 0;
2061 void ( APIENTRY * GLS_CONST glGetTexGenfv )(GLenum coord, GLenum pname, GLfloat *params) = 0;
2062 void ( APIENTRY * GLS_CONST glGetTexGeniv )(GLenum coord, GLenum pname, GLint *params) = 0;
2063 void ( APIENTRY * GLS_CONST glGetTexImage )(GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels) = 0;
2064 void ( APIENTRY * GLS_CONST glGetTexLevelParameterfv )(GLenum target, GLint level, GLenum pname, GLfloat *params) = 0;
2065 void ( APIENTRY * GLS_CONST glGetTexLevelParameteriv )(GLenum target, GLint level, GLenum pname, GLint *params) = 0;
2066 void ( APIENTRY * GLS_CONST glGetTexParameterfv )(GLenum target, GLenum pname, GLfloat *params) = 0;
2067 void ( APIENTRY * GLS_CONST glGetTexParameteriv )(GLenum target, GLenum pname, GLint *params) = 0;
2068 void ( APIENTRY * GLS_CONST glHint )(GLenum target, GLenum mode) = 0;
2069 void ( APIENTRY * GLS_CONST glIndexMask )(GLuint mask) = 0;
2070 void ( APIENTRY * GLS_CONST glIndexPointer )(GLenum type, GLsizei stride, const GLvoid *pointer) = 0;
2071 void ( APIENTRY * GLS_CONST glIndexd )(GLdouble c) = 0;
2072 void ( APIENTRY * GLS_CONST glIndexdv )(const GLdouble *c) = 0;
2073 void ( APIENTRY * GLS_CONST glIndexf )(GLfloat c) = 0;
2074 void ( APIENTRY * GLS_CONST glIndexfv )(const GLfloat *c) = 0;
2075 void ( APIENTRY * GLS_CONST glIndexi )(GLint c) = 0;
2076 void ( APIENTRY * GLS_CONST glIndexiv )(const GLint *c) = 0;
2077 void ( APIENTRY * GLS_CONST glIndexs )(GLshort c) = 0;
2078 void ( APIENTRY * GLS_CONST glIndexsv )(const GLshort *c) = 0;
2079 void ( APIENTRY * GLS_CONST glIndexub )(GLubyte c) = 0;
2080 void ( APIENTRY * GLS_CONST glIndexubv )(const GLubyte *c) = 0;
2081 void ( APIENTRY * GLS_CONST glInitNames )(void) = 0;
2082 void ( APIENTRY * GLS_CONST glInterleavedArrays )(GLenum format, GLsizei stride, const GLvoid *pointer) = 0;
2083 GLboolean ( APIENTRY * GLS_CONST glIsEnabled )(GLenum cap) = 0;
2084 GLboolean ( APIENTRY * GLS_CONST glIsList )(GLuint list) = 0;
2085 GLboolean ( APIENTRY * GLS_CONST glIsTexture )(GLuint texture) = 0;
2086 void ( APIENTRY * GLS_CONST glLightModelf )(GLenum pname, GLfloat param) = 0;
2087 void ( APIENTRY * GLS_CONST glLightModelfv )(GLenum pname, const GLfloat *params) = 0;
2088 void ( APIENTRY * GLS_CONST glLightModeli )(GLenum pname, GLint param) = 0;
2089 void ( APIENTRY * GLS_CONST glLightModeliv )(GLenum pname, const GLint *params) = 0;
2090 void ( APIENTRY * GLS_CONST glLightf )(GLenum light, GLenum pname, GLfloat param) = 0;
2091 void ( APIENTRY * GLS_CONST glLightfv )(GLenum light, GLenum pname, const GLfloat *params) = 0;
2092 void ( APIENTRY * GLS_CONST glLighti )(GLenum light, GLenum pname, GLint param) = 0;
2093 void ( APIENTRY * GLS_CONST glLightiv )(GLenum light, GLenum pname, const GLint *params) = 0;
2094 void ( APIENTRY * GLS_CONST glLineStipple )(GLint factor, GLushort pattern) = 0;
2095 void ( APIENTRY * GLS_CONST glLineWidth )(GLfloat width) = 0;
2096 void ( APIENTRY * GLS_CONST glListBase )(GLuint base) = 0;
2097 void ( APIENTRY * GLS_CONST glLoadIdentity )(void) = 0;
2098 void ( APIENTRY * GLS_CONST glLoadMatrixd )(const GLdouble *m) = 0;
2099 void ( APIENTRY * GLS_CONST glLoadMatrixf )(const GLfloat *m) = 0;
2100 void ( APIENTRY * GLS_CONST glLoadName )(GLuint name) = 0;
2101 void ( APIENTRY * GLS_CONST glLogicOp )(GLenum opcode) = 0;
2102 void ( APIENTRY * GLS_CONST glMap1d )(GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points) = 0;
2103 void ( APIENTRY * GLS_CONST glMap1f )(GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points) = 0;
2104 void ( APIENTRY * GLS_CONST glMap2d )(GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points) = 0;
2105 void ( APIENTRY * GLS_CONST glMap2f )(GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points) = 0;
2106 void ( APIENTRY * GLS_CONST glMapGrid1d )(GLint un, GLdouble u1, GLdouble u2) = 0;
2107 void ( APIENTRY * GLS_CONST glMapGrid1f )(GLint un, GLfloat u1, GLfloat u2) = 0;
2108 void ( APIENTRY * GLS_CONST glMapGrid2d )(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2) = 0;
2109 void ( APIENTRY * GLS_CONST glMapGrid2f )(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2) = 0;
2110 void ( APIENTRY * GLS_CONST glMaterialf )(GLenum face, GLenum pname, GLfloat param) = 0;
2111 void ( APIENTRY * GLS_CONST glMaterialfv )(GLenum face, GLenum pname, const GLfloat *params) = 0;
2112 void ( APIENTRY * GLS_CONST glMateriali )(GLenum face, GLenum pname, GLint param) = 0;
2113 void ( APIENTRY * GLS_CONST glMaterialiv )(GLenum face, GLenum pname, const GLint *params) = 0;
2114 void ( APIENTRY * GLS_CONST glMatrixMode )(GLenum mode) = 0;
2115 void ( APIENTRY * GLS_CONST glMultMatrixd )(const GLdouble *m) = 0;
2116 void ( APIENTRY * GLS_CONST glMultMatrixf )(const GLfloat *m) = 0;
2117 void ( APIENTRY * GLS_CONST glNewList )(GLuint list, GLenum mode) = 0;
2118 void ( APIENTRY * GLS_CONST glNormal3b )(GLbyte nx, GLbyte ny, GLbyte nz) = 0;
2119 void ( APIENTRY * GLS_CONST glNormal3bv )(const GLbyte *v) = 0;
2120 void ( APIENTRY * GLS_CONST glNormal3d )(GLdouble nx, GLdouble ny, GLdouble nz) = 0;
2121 void ( APIENTRY * GLS_CONST glNormal3dv )(const GLdouble *v) = 0;
2122 void ( APIENTRY * GLS_CONST glNormal3f )(GLfloat nx, GLfloat ny, GLfloat nz) = 0;
2123 void ( APIENTRY * GLS_CONST glNormal3fv )(const GLfloat *v) = 0;
2124 void ( APIENTRY * GLS_CONST glNormal3i )(GLint nx, GLint ny, GLint nz) = 0;
2125 void ( APIENTRY * GLS_CONST glNormal3iv )(const GLint *v) = 0;
2126 void ( APIENTRY * GLS_CONST glNormal3s )(GLshort nx, GLshort ny, GLshort nz) = 0;
2127 void ( APIENTRY * GLS_CONST glNormal3sv )(const GLshort *v) = 0;
2128 void ( APIENTRY * GLS_CONST glNormalPointer )(GLenum type, GLsizei stride, const GLvoid *pointer) = 0;
2129 void ( APIENTRY * GLS_CONST glOrtho )(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) = 0;
2130 void ( APIENTRY * GLS_CONST glPassThrough )(GLfloat token) = 0;
2131 void ( APIENTRY * GLS_CONST glPixelMapfv )(GLenum map, GLsizei mapsize, const GLfloat *values) = 0;
2132 void ( APIENTRY * GLS_CONST glPixelMapuiv )(GLenum map, GLsizei mapsize, const GLuint *values) = 0;
2133 void ( APIENTRY * GLS_CONST glPixelMapusv )(GLenum map, GLsizei mapsize, const GLushort *values) = 0;
2134 void ( APIENTRY * GLS_CONST glPixelStoref )(GLenum pname, GLfloat param) = 0;
2135 void ( APIENTRY * GLS_CONST glPixelStorei )(GLenum pname, GLint param) = 0;
2136 void ( APIENTRY * GLS_CONST glPixelTransferf )(GLenum pname, GLfloat param) = 0;
2137 void ( APIENTRY * GLS_CONST glPixelTransferi )(GLenum pname, GLint param) = 0;
2138 void ( APIENTRY * GLS_CONST glPixelZoom )(GLfloat xfactor, GLfloat yfactor) = 0;
2139 void ( APIENTRY * GLS_CONST glPointSize )(GLfloat size) = 0;
2140 void ( APIENTRY * GLS_CONST glPolygonMode )(GLenum face, GLenum mode) = 0;
2141 void ( APIENTRY * GLS_CONST glPolygonOffset )(GLfloat factor, GLfloat units) = 0;
2142 void ( APIENTRY * GLS_CONST glPolygonStipple )(const GLubyte *mask) = 0;
2143 void ( APIENTRY * GLS_CONST glPopAttrib )(void) = 0;
2144 void ( APIENTRY * GLS_CONST glPopClientAttrib )(void) = 0;
2145 void ( APIENTRY * GLS_CONST glPopMatrix )(void) = 0;
2146 void ( APIENTRY * GLS_CONST glPopName )(void) = 0;
2147 void ( APIENTRY * GLS_CONST glPrioritizeTextures )(GLsizei n, const GLuint *textures, const GLclampf *priorities) = 0;
2148 void ( APIENTRY * GLS_CONST glPushAttrib )(GLbitfield mask) = 0;
2149 void ( APIENTRY * GLS_CONST glPushClientAttrib )(GLbitfield mask) = 0;
2150 void ( APIENTRY * GLS_CONST glPushMatrix )(void) = 0;
2151 void ( APIENTRY * GLS_CONST glPushName )(GLuint name) = 0;
2152 void ( APIENTRY * GLS_CONST glRasterPos2d )(GLdouble x, GLdouble y) = 0;
2153 void ( APIENTRY * GLS_CONST glRasterPos2dv )(const GLdouble *v) = 0;
2154 void ( APIENTRY * GLS_CONST glRasterPos2f )(GLfloat x, GLfloat y) = 0;
2155 void ( APIENTRY * GLS_CONST glRasterPos2fv )(const GLfloat *v) = 0;
2156 void ( APIENTRY * GLS_CONST glRasterPos2i )(GLint x, GLint y) = 0;
2157 void ( APIENTRY * GLS_CONST glRasterPos2iv )(const GLint *v) = 0;
2158 void ( APIENTRY * GLS_CONST glRasterPos2s )(GLshort x, GLshort y) = 0;
2159 void ( APIENTRY * GLS_CONST glRasterPos2sv )(const GLshort *v) = 0;
2160 void ( APIENTRY * GLS_CONST glRasterPos3d )(GLdouble x, GLdouble y, GLdouble z) = 0;
2161 void ( APIENTRY * GLS_CONST glRasterPos3dv )(const GLdouble *v) = 0;
2162 void ( APIENTRY * GLS_CONST glRasterPos3f )(GLfloat x, GLfloat y, GLfloat z) = 0;
2163 void ( APIENTRY * GLS_CONST glRasterPos3fv )(const GLfloat *v) = 0;
2164 void ( APIENTRY * GLS_CONST glRasterPos3i )(GLint x, GLint y, GLint z) = 0;
2165 void ( APIENTRY * GLS_CONST glRasterPos3iv )(const GLint *v) = 0;
2166 void ( APIENTRY * GLS_CONST glRasterPos3s )(GLshort x, GLshort y, GLshort z) = 0;
2167 void ( APIENTRY * GLS_CONST glRasterPos3sv )(const GLshort *v) = 0;
2168 void ( APIENTRY * GLS_CONST glRasterPos4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w) = 0;
2169 void ( APIENTRY * GLS_CONST glRasterPos4dv )(const GLdouble *v) = 0;
2170 void ( APIENTRY * GLS_CONST glRasterPos4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
2171 void ( APIENTRY * GLS_CONST glRasterPos4fv )(const GLfloat *v) = 0;
2172 void ( APIENTRY * GLS_CONST glRasterPos4i )(GLint x, GLint y, GLint z, GLint w) = 0;
2173 void ( APIENTRY * GLS_CONST glRasterPos4iv )(const GLint *v) = 0;
2174 void ( APIENTRY * GLS_CONST glRasterPos4s )(GLshort x, GLshort y, GLshort z, GLshort w) = 0;
2175 void ( APIENTRY * GLS_CONST glRasterPos4sv )(const GLshort *v) = 0;
2176 void ( APIENTRY * GLS_CONST glReadBuffer )(GLenum mode) = 0;
2177 void ( APIENTRY * GLS_CONST glReadPixels )(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels) = 0;
2178 void ( APIENTRY * GLS_CONST glRectd )(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2) = 0;
2179 void ( APIENTRY * GLS_CONST glRectdv )(const GLdouble *v1, const GLdouble *v2) = 0;
2180 void ( APIENTRY * GLS_CONST glRectf )(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2) = 0;
2181 void ( APIENTRY * GLS_CONST glRectfv )(const GLfloat *v1, const GLfloat *v2) = 0;
2182 void ( APIENTRY * GLS_CONST glRecti )(GLint x1, GLint y1, GLint x2, GLint y2) = 0;
2183 void ( APIENTRY * GLS_CONST glRectiv )(const GLint *v1, const GLint *v2) = 0;
2184 void ( APIENTRY * GLS_CONST glRects )(GLshort x1, GLshort y1, GLshort x2, GLshort y2) = 0;
2185 void ( APIENTRY * GLS_CONST glRectsv )(const GLshort *v1, const GLshort *v2) = 0;
2186 GLint ( APIENTRY * GLS_CONST glRenderMode )(GLenum mode) = 0;
2187 void ( APIENTRY * GLS_CONST glRotated )(GLdouble angle, GLdouble x, GLdouble y, GLdouble z) = 0;
2188 void ( APIENTRY * GLS_CONST glRotatef )(GLfloat angle, GLfloat x, GLfloat y, GLfloat z) = 0;
2189 void ( APIENTRY * GLS_CONST glScaled )(GLdouble x, GLdouble y, GLdouble z) = 0;
2190 void ( APIENTRY * GLS_CONST glScalef )(GLfloat x, GLfloat y, GLfloat z) = 0;
2191 void ( APIENTRY * GLS_CONST glScissor )(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
2192 void ( APIENTRY * GLS_CONST glSelectBuffer )(GLsizei size, GLuint *buffer) = 0;
2193 void ( APIENTRY * GLS_CONST glShadeModel )(GLenum mode) = 0;
2194 void ( APIENTRY * GLS_CONST glStencilFunc )(GLenum func, GLint ref, GLuint mask) = 0;
2195 void ( APIENTRY * GLS_CONST glStencilMask )(GLuint mask) = 0;
2196 void ( APIENTRY * GLS_CONST glStencilOp )(GLenum fail, GLenum zfail, GLenum zpass) = 0;
2197 void ( APIENTRY * GLS_CONST glTexCoord1d )(GLdouble s) = 0;
2198 void ( APIENTRY * GLS_CONST glTexCoord1dv )(const GLdouble *v) = 0;
2199 void ( APIENTRY * GLS_CONST glTexCoord1f )(GLfloat s) = 0;
2200 void ( APIENTRY * GLS_CONST glTexCoord1fv )(const GLfloat *v) = 0;
2201 void ( APIENTRY * GLS_CONST glTexCoord1i )(GLint s) = 0;
2202 void ( APIENTRY * GLS_CONST glTexCoord1iv )(const GLint *v) = 0;
2203 void ( APIENTRY * GLS_CONST glTexCoord1s )(GLshort s) = 0;
2204 void ( APIENTRY * GLS_CONST glTexCoord1sv )(const GLshort *v) = 0;
2205 void ( APIENTRY * GLS_CONST glTexCoord2d )(GLdouble s, GLdouble t) = 0;
2206 void ( APIENTRY * GLS_CONST glTexCoord2dv )(const GLdouble *v) = 0;
2207 void ( APIENTRY * GLS_CONST glTexCoord2f )(GLfloat s, GLfloat t) = 0;
2208 void ( APIENTRY * GLS_CONST glTexCoord2fv )(const GLfloat *v) = 0;
2209 void ( APIENTRY * GLS_CONST glTexCoord2i )(GLint s, GLint t) = 0;
2210 void ( APIENTRY * GLS_CONST glTexCoord2iv )(const GLint *v) = 0;
2211 void ( APIENTRY * GLS_CONST glTexCoord2s )(GLshort s, GLshort t) = 0;
2212 void ( APIENTRY * GLS_CONST glTexCoord2sv )(const GLshort *v) = 0;
2213 void ( APIENTRY * GLS_CONST glTexCoord3d )(GLdouble s, GLdouble t, GLdouble r) = 0;
2214 void ( APIENTRY * GLS_CONST glTexCoord3dv )(const GLdouble *v) = 0;
2215 void ( APIENTRY * GLS_CONST glTexCoord3f )(GLfloat s, GLfloat t, GLfloat r) = 0;
2216 void ( APIENTRY * GLS_CONST glTexCoord3fv )(const GLfloat *v) = 0;
2217 void ( APIENTRY * GLS_CONST glTexCoord3i )(GLint s, GLint t, GLint r) = 0;
2218 void ( APIENTRY * GLS_CONST glTexCoord3iv )(const GLint *v) = 0;
2219 void ( APIENTRY * GLS_CONST glTexCoord3s )(GLshort s, GLshort t, GLshort r) = 0;
2220 void ( APIENTRY * GLS_CONST glTexCoord3sv )(const GLshort *v) = 0;
2221 void ( APIENTRY * GLS_CONST glTexCoord4d )(GLdouble s, GLdouble t, GLdouble r, GLdouble q) = 0;
2222 void ( APIENTRY * GLS_CONST glTexCoord4dv )(const GLdouble *v) = 0;
2223 void ( APIENTRY * GLS_CONST glTexCoord4f )(GLfloat s, GLfloat t, GLfloat r, GLfloat q) = 0;
2224 void ( APIENTRY * GLS_CONST glTexCoord4fv )(const GLfloat *v) = 0;
2225 void ( APIENTRY * GLS_CONST glTexCoord4i )(GLint s, GLint t, GLint r, GLint q) = 0;
2226 void ( APIENTRY * GLS_CONST glTexCoord4iv )(const GLint *v) = 0;
2227 void ( APIENTRY * GLS_CONST glTexCoord4s )(GLshort s, GLshort t, GLshort r, GLshort q) = 0;
2228 void ( APIENTRY * GLS_CONST glTexCoord4sv )(const GLshort *v) = 0;
2229 void ( APIENTRY * GLS_CONST glTexCoordPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = 0;
2230 void ( APIENTRY * GLS_CONST glTexEnvf )(GLenum target, GLenum pname, GLfloat param) = 0;
2231 void ( APIENTRY * GLS_CONST glTexEnvfv )(GLenum target, GLenum pname, const GLfloat *params) = 0;
2232 void ( APIENTRY * GLS_CONST glTexEnvi )(GLenum target, GLenum pname, GLint param) = 0;
2233 void ( APIENTRY * GLS_CONST glTexEnviv )(GLenum target, GLenum pname, const GLint *params) = 0;
2234 void ( APIENTRY * GLS_CONST glTexGend )(GLenum coord, GLenum pname, GLdouble param) = 0;
2235 void ( APIENTRY * GLS_CONST glTexGendv )(GLenum coord, GLenum pname, const GLdouble *params) = 0;
2236 void ( APIENTRY * GLS_CONST glTexGenf )(GLenum coord, GLenum pname, GLfloat param) = 0;
2237 void ( APIENTRY * GLS_CONST glTexGenfv )(GLenum coord, GLenum pname, const GLfloat *params) = 0;
2238 void ( APIENTRY * GLS_CONST glTexGeni )(GLenum coord, GLenum pname, GLint param) = 0;
2239 void ( APIENTRY * GLS_CONST glTexGeniv )(GLenum coord, GLenum pname, const GLint *params) = 0;
2240 void ( APIENTRY * GLS_CONST glTexImage1D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels) = 0;
2241 void ( APIENTRY * GLS_CONST glTexImage2D )(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels) = 0;
2242 void ( APIENTRY * GLS_CONST glTexParameterf )(GLenum target, GLenum pname, GLfloat param) = 0;
2243 void ( APIENTRY * GLS_CONST glTexParameterfv )(GLenum target, GLenum pname, const GLfloat *params) = 0;
2244 void ( APIENTRY * GLS_CONST glTexParameteri )(GLenum target, GLenum pname, GLint param) = 0;
2245 void ( APIENTRY * GLS_CONST glTexParameteriv )(GLenum target, GLenum pname, const GLint *params) = 0;
2246 void ( APIENTRY * GLS_CONST glTexSubImage1D )(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels) = 0;
2247 void ( APIENTRY * GLS_CONST glTexSubImage2D )(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels) = 0;
2248 void ( APIENTRY * GLS_CONST glTranslated )(GLdouble x, GLdouble y, GLdouble z) = 0;
2249 void ( APIENTRY * GLS_CONST glTranslatef )(GLfloat x, GLfloat y, GLfloat z) = 0;
2250 void ( APIENTRY * GLS_CONST glVertex2d )(GLdouble x, GLdouble y) = 0;
2251 void ( APIENTRY * GLS_CONST glVertex2dv )(const GLdouble *v) = 0;
2252 void ( APIENTRY * GLS_CONST glVertex2f )(GLfloat x, GLfloat y) = 0;
2253 void ( APIENTRY * GLS_CONST glVertex2fv )(const GLfloat *v) = 0;
2254 void ( APIENTRY * GLS_CONST glVertex2i )(GLint x, GLint y) = 0;
2255 void ( APIENTRY * GLS_CONST glVertex2iv )(const GLint *v) = 0;
2256 void ( APIENTRY * GLS_CONST glVertex2s )(GLshort x, GLshort y) = 0;
2257 void ( APIENTRY * GLS_CONST glVertex2sv )(const GLshort *v) = 0;
2258 void ( APIENTRY * GLS_CONST glVertex3d )(GLdouble x, GLdouble y, GLdouble z) = 0;
2259 void ( APIENTRY * GLS_CONST glVertex3dv )(const GLdouble *v) = 0;
2260 void ( APIENTRY * GLS_CONST glVertex3f )(GLfloat x, GLfloat y, GLfloat z) = 0;
2261 void ( APIENTRY * GLS_CONST glVertex3fv )(const GLfloat *v) = 0;
2262 void ( APIENTRY * GLS_CONST glVertex3i )(GLint x, GLint y, GLint z) = 0;
2263 void ( APIENTRY * GLS_CONST glVertex3iv )(const GLint *v) = 0;
2264 void ( APIENTRY * GLS_CONST glVertex3s )(GLshort x, GLshort y, GLshort z) = 0;
2265 void ( APIENTRY * GLS_CONST glVertex3sv )(const GLshort *v) = 0;
2266 void ( APIENTRY * GLS_CONST glVertex4d )(GLdouble x, GLdouble y, GLdouble z, GLdouble w) = 0;
2267 void ( APIENTRY * GLS_CONST glVertex4dv )(const GLdouble *v) = 0;
2268 void ( APIENTRY * GLS_CONST glVertex4f )(GLfloat x, GLfloat y, GLfloat z, GLfloat w) = 0;
2269 void ( APIENTRY * GLS_CONST glVertex4fv )(const GLfloat *v) = 0;
2270 void ( APIENTRY * GLS_CONST glVertex4i )(GLint x, GLint y, GLint z, GLint w) = 0;
2271 void ( APIENTRY * GLS_CONST glVertex4iv )(const GLint *v) = 0;
2272 void ( APIENTRY * GLS_CONST glVertex4s )(GLshort x, GLshort y, GLshort z, GLshort w) = 0;
2273 void ( APIENTRY * GLS_CONST glVertex4sv )(const GLshort *v) = 0;
2274 void ( APIENTRY * GLS_CONST glVertexPointer )(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer) = 0;
2275 void ( APIENTRY * GLS_CONST glViewport )(GLint x, GLint y, GLsizei width, GLsizei height) = 0;
2276 
2277 /*----------------------------------------------------------------------------
2278   ----------------------------------------------------------------------------
2279   ----------------------------------------------------------------------------
2280 
2281 GLU function pointers.
2282 
2283 */
2284 
2285 #ifndef GLS_NO_GLU
2286 
2287 void ( APIENTRY * GLS_CONST gluBeginCurve ) (GLUnurbs* nurb) = 0;
2288 void ( APIENTRY * GLS_CONST gluBeginPolygon ) (GLUtesselator* tess) = 0;
2289 void ( APIENTRY * GLS_CONST gluBeginSurface ) (GLUnurbs* nurb) = 0;
2290 void ( APIENTRY * GLS_CONST gluBeginTrim ) (GLUnurbs* nurb) = 0;
2291 GLint ( APIENTRY * GLS_CONST gluBuild1DMipmaps ) (GLenum target, GLint component, GLsizei width, GLenum format, GLenum type, const void *data) = 0;
2292 GLint ( APIENTRY * GLS_CONST gluBuild2DMipmaps ) (GLenum target, GLint component, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data) = 0;
2293 void ( APIENTRY * GLS_CONST gluCylinder ) (GLUquadric* quad, GLdouble base, GLdouble top, GLdouble height, GLint slices, GLint stacks) = 0;
2294 void ( APIENTRY * GLS_CONST gluDeleteNurbsRenderer ) (GLUnurbs* nurb) = 0;
2295 void ( APIENTRY * GLS_CONST gluDeleteQuadric ) (GLUquadric* quad) = 0;
2296 void ( APIENTRY * GLS_CONST gluDeleteTess ) (GLUtesselator* tess) = 0;
2297 void ( APIENTRY * GLS_CONST gluDisk ) (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops) = 0;
2298 void ( APIENTRY * GLS_CONST gluEndCurve ) (GLUnurbs* nurb) = 0;
2299 void ( APIENTRY * GLS_CONST gluEndPolygon ) (GLUtesselator* tess) = 0;
2300 void ( APIENTRY * GLS_CONST gluEndSurface ) (GLUnurbs* nurb) = 0;
2301 void ( APIENTRY * GLS_CONST gluEndTrim ) (GLUnurbs* nurb) = 0;
2302 const GLubyte * ( APIENTRY * GLS_CONST gluErrorString ) (GLenum error) = 0;
2303 void ( APIENTRY * GLS_CONST gluGetNurbsProperty ) (GLUnurbs* nurb, GLenum property, GLfloat* data) = 0;
2304 const GLubyte * ( APIENTRY * GLS_CONST gluGetString ) (GLenum name) = 0;
2305 void ( APIENTRY * GLS_CONST gluGetTessProperty ) (GLUtesselator* tess, GLenum which, GLdouble* data) = 0;
2306 void ( APIENTRY * GLS_CONST gluLoadSamplingMatrices ) (GLUnurbs* nurb, const GLfloat *model, const GLfloat *perspective, const GLint *view) = 0;
2307 void ( APIENTRY * GLS_CONST gluLookAt ) (GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ) = 0;
2308 GLUnurbs* ( APIENTRY * GLS_CONST gluNewNurbsRenderer ) (void) = 0;
2309 GLUquadric* ( APIENTRY * GLS_CONST gluNewQuadric ) (void) = 0;
2310 GLUtesselator* ( APIENTRY * GLS_CONST gluNewTess ) (void) = 0;
2311 void ( APIENTRY * GLS_CONST gluNextContour ) (GLUtesselator* tess, GLenum type) = 0;
2312 void ( APIENTRY * GLS_CONST gluNurbsCallback ) (GLUnurbs* nurb, GLenum which, GLvoid (CALLBACK *CallBackFunc)()) = 0;
2313 void ( APIENTRY * GLS_CONST gluNurbsCurve ) (GLUnurbs* nurb, GLint knotCount, GLfloat *knots, GLint stride, GLfloat *control, GLint order, GLenum type) = 0;
2314 void ( APIENTRY * GLS_CONST gluNurbsProperty ) (GLUnurbs* nurb, GLenum property, GLfloat value) = 0;
2315 void ( APIENTRY * GLS_CONST gluNurbsSurface ) (GLUnurbs* nurb, GLint sKnotCount, GLfloat* sKnots, GLint tKnotCount, GLfloat* tKnots, GLint sStride, GLint tStride, GLfloat* control, GLint sOrder, GLint tOrder, GLenum type) = 0;
2316 void ( APIENTRY * GLS_CONST gluOrtho2D ) (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top) = 0;
2317 void ( APIENTRY * GLS_CONST gluPartialDisk ) (GLUquadric* quad, GLdouble inner, GLdouble outer, GLint slices, GLint loops, GLdouble start, GLdouble sweep) = 0;
2318 void ( APIENTRY * GLS_CONST gluPerspective ) (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) = 0;
2319 void ( APIENTRY * GLS_CONST gluPickMatrix ) (GLdouble x, GLdouble y, GLdouble delX, GLdouble delY, GLint *viewport) = 0;
2320 GLint ( APIENTRY * GLS_CONST gluProject ) (GLdouble objX, GLdouble objY, GLdouble objZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* winX, GLdouble* winY, GLdouble* winZ) = 0;
2321 void ( APIENTRY * GLS_CONST gluPwlCurve ) (GLUnurbs* nurb, GLint count, GLfloat* data, GLint stride, GLenum type) = 0;
2322 void ( APIENTRY * GLS_CONST gluQuadricCallback ) (GLUquadric* quad, GLenum which, GLvoid (CALLBACK *CallBackFunc)()) = 0;
2323 void ( APIENTRY * GLS_CONST gluQuadricDrawStyle ) (GLUquadric* quad, GLenum draw) = 0;
2324 void ( APIENTRY * GLS_CONST gluQuadricNormals ) (GLUquadric* quad, GLenum normal) = 0;
2325 void ( APIENTRY * GLS_CONST gluQuadricOrientation ) (GLUquadric* quad, GLenum orientation) = 0;
2326 void ( APIENTRY * GLS_CONST gluQuadricTexture ) (GLUquadric* quad, GLboolean texture) = 0;
2327 GLint ( APIENTRY * GLS_CONST gluScaleImage ) (GLenum format, GLsizei wIn, GLsizei hIn, GLenum typeIn, const void *dataIn, GLsizei wOut, GLsizei hOut, GLenum typeOut, GLvoid* dataOut) = 0;
2328 void ( APIENTRY * GLS_CONST gluSphere ) (GLUquadric* quad, GLdouble radius, GLint slices, GLint stacks) = 0;
2329 void ( APIENTRY * GLS_CONST gluTessBeginContour ) (GLUtesselator* tess) = 0;
2330 void ( APIENTRY * GLS_CONST gluTessBeginPolygon ) (GLUtesselator* tess, GLvoid* data) = 0;
2331 void ( APIENTRY * GLS_CONST gluTessCallback ) (GLUtesselator* tess, GLenum which, GLvoid (CALLBACK *CallBackFunc)()) = 0;
2332 void ( APIENTRY * GLS_CONST gluTessEndContour ) (GLUtesselator* tess) = 0;
2333 void ( APIENTRY * GLS_CONST gluTessEndPolygon ) (GLUtesselator* tess) = 0;
2334 void ( APIENTRY * GLS_CONST gluTessNormal ) (GLUtesselator* tess, GLdouble valueX, GLdouble valueY, GLdouble valueZ) = 0;
2335 void ( APIENTRY * GLS_CONST gluTessProperty ) (GLUtesselator* tess, GLenum which, GLdouble data) = 0;
2336 void ( APIENTRY * GLS_CONST gluTessVertex ) (GLUtesselator* tess, GLdouble *location, GLvoid* data) = 0;
2337 GLint ( APIENTRY * GLS_CONST gluUnProject ) (GLdouble winX, GLdouble winY, GLdouble winZ, const GLdouble *model, const GLdouble *proj, const GLint *view, GLdouble* objX, GLdouble* objY, GLdouble* objZ) = 0;
2338 
2339 #endif   /* GLS_NO_GLU */
2340 
2341 /*----------------------------------------------------------------------------
2342   ----------------------------------------------------------------------------
2343   ----------------------------------------------------------------------------
2344 
2345 OpenGL extension pointers.
2346 
2347 */
2348 
2349 
2350