/*
** Copyright 2000 by Konstantin Baumann <Konstantin.Baumann@uni-muenster.de>
**
****************************************************************************
** $Log: glext.h,v $
** Revision 2.6  2000/06/07 12:42:46  kostab
** EXT_light_max_exponent added
**
** Initial version  2000/??/?? ??:??:??  kostab
**
****************************************************************************
**
** this file defines the following extensions:
**     ARB_multitexture
**     ARB_texture_compression
**     ARB_transpose_matrix
**     EXT_abgr
**     EXT_blend_color
**     EXT_blend_minmax
**     EXT_blend_subtract
**     EXT_clip_volume_hint
**     EXT_compiled_vertex_array
**     EXT_cull_vertex
**     EXT_fog_coord
**     EXT_light_max_exponent
**     EXT_packed_pixels
**     EXT_paletted_texture
**     EXT_point_parameters
**     EXT_rescale_normal
**     EXT_secondary_color
**     EXT_separate_specular_color
**     EXT_shared_texture_palette
**     EXT_stencil_wrap
**     EXT_texture_cube_map
**     EXT_texture_edge_clamp
**     EXT_texture_env_add
**     EXT_texture_env_combine
**     EXT_texture_filter_anisotropic
**     EXT_texture_lod_bias
**     EXT_vertex_array
**     EXT_vertex_weighting
**     NV_fog_distance
**     NV_light_max_exponent
**     NV_register_combiners
**     NV_texgen_emboss
**     NV_texgen_reflection
**     NV_texture_env_combine4
**     NV_vertex_array_range
**     S3_s3tc
**     WIN_swap_hint
*/

/*
** I have used some "macro-magic" for providing functions contained in extensions as
** ordinary functions. You can use the extension functions just like normal OpenGL
** functions, e.g.:
** 
**     ...
**     glActiveTextureARB(GL_TEXTURE1_ARB);
**     ...
** 
** instead of:
** 
**     ...
**     GLACTIVETEXTUREARBPROC glActiveTextureARB = 0;
**     ...
**     glActiveTextureARB = (GLACTIVETEXTUREARBPROC)wglGetProcAddress(...);
**     ...
**     (*glActiveTextureARB)(GL_TEXTURE1_ARB);
**     ...
** 
** If the desired function is not available as extension (if wglGetProcAddress() returns 0)
** the function call is completly ignored (no error is thrown). That simplifies the
** usage of some extensions, e.g. for EXT_compiled_vertex_array:
** 
**     ...
**     glLockArraysEXT(first, count); // will be ignored if not available, no error
**     ...
**     // use the vertex array
**     ...
**     glUnlockArraysEXT();           // will be ignored if not available, no error
**     ...
**
** If you want to use this mechanism with multiple rendering contexts you have to 
**     #define GLEXT_USE_MULTIPLE_CONTEXTS
** before including glext.h to use an implementation with a slight overhead, which
** manages the function pointers for each rendering context.
** 
*/

#ifndef _GLEXT_H_
#define _GLEXT_H_

#ifdef WIN32

#ifdef __cplusplus
extern "C" {
#else /* __cplusplus */
#define inline static
#endif /* __cplusplus */

#ifndef APIENTRY
#define WIN32_LEAN_AND_MEAN 1
#include <windows.h>
#endif /* APIENTRY */

#include <GL/gl.h>

#ifndef GLEXT_USE_MULTIPLE_CONTEXTS

#define GET_PROC_ADDRESS(NAME, PARAMETER_DEF, PARAMETER_LIST) \
    typedef void (APIENTRY* TYPEDEF ##NAME) PARAMETER_DEF; \
    static void APIENTRY GETPROC ##NAME PARAMETER_DEF; \
    static void APIENTRY NOOP ##NAME PARAMETER_DEF { return; } \
    static TYPEDEF ##NAME NAME = GETPROC ##NAME; \
    static void APIENTRY GETPROC ##NAME PARAMETER_DEF { \
        NAME = (TYPEDEF ##NAME)wglGetProcAddress(#NAME); \
        if(!NAME) { NAME = NOOP ##NAME; }\
    }

#define GET_PROC_ADDRESS_2(TYPE, NAME, PARAMETER_DEF, PARAMETER_LIST) \
    typedef TYPE (APIENTRY* TYPEDEF ##NAME) PARAMETER_DEF; \
    static TYPE APIENTRY GETPROC ##NAME PARAMETER_DEF; \
    static TYPE APIENTRY NOOP ##NAME PARAMETER_DEF { return (TYPE)NULL; } \
    static TYPEDEF ##NAME NAME = GETPROC ##NAME; \
    static TYPE APIENTRY GETPROC ##NAME PARAMETER_DEF { \
        NAME = (TYPEDEF ##NAME)wglGetProcAddress(#NAME); \
        if(!NAME) { NAME = NOOP ##NAME; }return (TYPE)NULL; \
    }
#else /* GLEXT_USE_MULTIPLE_CONTEXTS */

#define GET_PROC_ADDRESS(NAME, PARAMETER_DEF, PARAMETER_LIST) \
    inline void NAME PARAMETER_DEF { \
        typedef void (APIENTRY* FUNCTION) PARAMETER_DEF; \
        static FUNCTION function = NULL; \
        static HGLRC lastContext = NULL; \
        HGLRC currentContext = wglGetCurrentContext(); \
        if(lastContext != currentContext) { \
            lastContext = currentContext; \
            function = (FUNCTION)wglGetProcAddress(#NAME); \
        } \
        if(function) { function PARAMETER_LIST; } \
    }

#define GET_PROC_ADDRESS_2(TYPE, NAME, PARAMETER_DEF, PARAMETER_LIST) \
    inline TYPE NAME PARAMETER_DEF { \
        typedef TYPE (APIENTRY* FUNCTION) PARAMETER_DEF; \
        static FUNCTION function = NULL; \
        static HGLRC lastContext = NULL; \
        HGLRC currentContext = wglGetCurrentContext(); \
        if(lastContext != currentContext) { \
            lastContext = currentContext; \
            function = (FUNCTION)wglGetProcAddress(#NAME); \
        } \
        if(function) { return function PARAMETER_LIST; } \
		return (TYPE)NULL; \
    }

#endif /* GLEXT_USE_MULTIPLE_CONTEXTS */

/* ARB_multitexture */
#ifndef GL_ARB_multitexture
#define GL_ARB_multitexture                 1
#define GL_ACTIVE_TEXTURE_ARB               0x84E0
#define GL_CLIENT_ACTIVE_TEXTURE_ARB        0x84E1
#define GL_MAX_TEXTURE_UNITS_ARB            0x84E2
#define GL_TEXTURE0_ARB                     0x84C0
#define GL_TEXTURE1_ARB                     0x84C1
#define GL_TEXTURE2_ARB                     0x84C2
#define GL_TEXTURE3_ARB                     0x84C3
#define GL_TEXTURE4_ARB                     0x84C4
#define GL_TEXTURE5_ARB                     0x84C5
#define GL_TEXTURE6_ARB                     0x84C6
#define GL_TEXTURE7_ARB                     0x84C7
#define GL_TEXTURE8_ARB                     0x84C8
#define GL_TEXTURE9_ARB                     0x84C9
#define GL_TEXTURE10_ARB                    0x84CA
#define GL_TEXTURE11_ARB                    0x84CB
#define GL_TEXTURE12_ARB                    0x84CC
#define GL_TEXTURE13_ARB                    0x84CD
#define GL_TEXTURE14_ARB                    0x84CE
#define GL_TEXTURE15_ARB                    0x84CF
#define GL_TEXTURE16_ARB                    0x84D0
#define GL_TEXTURE17_ARB                    0x84D1
#define GL_TEXTURE18_ARB                    0x84D2
#define GL_TEXTURE19_ARB                    0x84D3
#define GL_TEXTURE20_ARB                    0x84D4
#define GL_TEXTURE21_ARB                    0x84D5
#define GL_TEXTURE22_ARB                    0x84D6
#define GL_TEXTURE23_ARB                    0x84D7
#define GL_TEXTURE24_ARB                    0x84D8
#define GL_TEXTURE25_ARB                    0x84D9
#define GL_TEXTURE26_ARB                    0x84DA
#define GL_TEXTURE27_ARB                    0x84DB
#define GL_TEXTURE28_ARB                    0x84DC
#define GL_TEXTURE29_ARB                    0x84DD
#define GL_TEXTURE30_ARB                    0x84DE
#define GL_TEXTURE31_ARB                    0x84DF
GET_PROC_ADDRESS(glMultiTexCoord1dARB, (GLenum target, GLdouble s), (target, s))
GET_PROC_ADDRESS(glMultiTexCoord1dvARB, (GLenum target, const GLdouble* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord1fARB, (GLenum target, GLfloat s), (target, s))
GET_PROC_ADDRESS(glMultiTexCoord1fvARB, (GLenum target, const GLfloat* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord1iARB, (GLenum target, GLint s), (target, s))
GET_PROC_ADDRESS(glMultiTexCoord1ivARB, (GLenum target, const GLint* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord1sARB, (GLenum target, GLshort s), (target, s))
GET_PROC_ADDRESS(glMultiTexCoord1svARB, (GLenum target, const GLshort* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord2dARB, (GLenum target, GLdouble s, GLdouble t), (target, s, t))
GET_PROC_ADDRESS(glMultiTexCoord2dvARB, (GLenum target, const GLdouble* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord2fARB, (GLenum target, GLfloat s, GLfloat t), (target, s, t))
GET_PROC_ADDRESS(glMultiTexCoord2fvARB, (GLenum target, const GLfloat* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord2iARB, (GLenum target, GLint s, GLint t), (target, s, t))
GET_PROC_ADDRESS(glMultiTexCoord2ivARB, (GLenum target, const GLint* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord2sARB, (GLenum target, GLshort s, GLshort t), (target, s, t))
GET_PROC_ADDRESS(glMultiTexCoord2svARB, (GLenum target, const GLshort* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord3dARB, (GLenum target, GLdouble s, GLdouble t, GLdouble r), (target, s, t, r))
GET_PROC_ADDRESS(glMultiTexCoord3dvARB, (GLenum target, const GLdouble* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord3fARB, (GLenum target, GLfloat s, GLfloat t, GLfloat r), (target, s, t, r))
GET_PROC_ADDRESS(glMultiTexCoord3fvARB, (GLenum target, const GLfloat* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord3iARB, (GLenum target, GLint s, GLint t, GLint r), (target, s, t, r))
GET_PROC_ADDRESS(glMultiTexCoord3ivARB, (GLenum target, const GLint* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord3sARB, (GLenum target, GLshort s, GLshort t, GLshort r), (target, s, t, r))
GET_PROC_ADDRESS(glMultiTexCoord3svARB, (GLenum target, const GLshort* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord4dARB, (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q), (target, s, t, r, q))
GET_PROC_ADDRESS(glMultiTexCoord4dvARB, (GLenum target, const GLdouble* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord4fARB, (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q), (target, s, t, r, q))
GET_PROC_ADDRESS(glMultiTexCoord4fvARB, (GLenum target, const GLfloat* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord4iARB, (GLenum target, GLint s, GLint t, GLint r, GLint q), (target, s, t, r, q))
GET_PROC_ADDRESS(glMultiTexCoord4ivARB, (GLenum target, const GLint* v), (target, v))
GET_PROC_ADDRESS(glMultiTexCoord4sARB, (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q), (target, s, t, r, q))
GET_PROC_ADDRESS(glMultiTexCoord4svARB, (GLenum target, const GLshort* v), (target, v))
GET_PROC_ADDRESS(glActiveTextureARB, (GLenum target), (target))
GET_PROC_ADDRESS(glClientActiveTextureARB, (GLenum target), (target))
#endif /* GL_ARB_multitexture */

/* ARB_texture_compression */
#ifndef GL_ARB_texture_compression
#define GL_ARB_texture_compression            1
#define GL_COMPRESSED_ALPHA_ARB               0x84E9
#define GL_COMPRESSED_LUMINANCE_ARB           0x84EA
#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB     0x84EB
#define GL_COMPRESSED_INTENSITY_ARB           0x84EC
#define GL_COMPRESSED_RGB_ARB                 0x84ED
#define GL_COMPRESSED_RGBA_ARB                0x84EE
#define GL_TEXTURE_COMPRESSION_HINT_ARB       0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB  0x86A0
#define GL_TEXTURE_COMPRESSED_ARB             0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS_ARB     0x86A3
GET_PROC_ADDRESS(glCompressedTexImage3DARB, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid* data), (target, level, internalformat, width, height, depth, border, imageSize, data))
GET_PROC_ADDRESS(glCompressedTexImage2DARB, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data), (target, level, internalformat, width, height, border, imageSize, data))
GET_PROC_ADDRESS(glCompressedTexImage1DARB, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid* data), (target, level, internalformat, width, border, imageSize, data))
GET_PROC_ADDRESS(glCompressedTexSubImage3DARB, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid* data), (target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data))
GET_PROC_ADDRESS(glCompressedTexSubImage2DARB, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data), (target, level, xoffset, yoffset, width, height, format, imageSize, data))
GET_PROC_ADDRESS(glCompressedTexSubImage1DARB, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid* data), (target, level, xoffset, width, format, imageSize, data))
GET_PROC_ADDRESS(glGetCompressedTexImageARB, (GLenum target, GLint lod, const GLvoid* img), (target, lod, img))
#endif /* GL_ARB_texture_compression */

/* ARB_transpose_matrix */
#ifndef GL_ARB_transpose_matrix
#define GL_ARB_transpose_matrix             1
#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB   0x84E3
#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB  0x84E4
#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB     0x84E5
#define GL_TRANSPOSE_COLOR_MATRIX_ARB       0x84E6
GET_PROC_ADDRESS(glLoadTransposeMatrixdARB, (const GLdouble* matrix), (matrix))
GET_PROC_ADDRESS(glLoadTransposeMatrixfARB, (const GLfloat* matrix), (matrix))
GET_PROC_ADDRESS(glMultTransposeMatrixdARB, (const GLdouble* matrix), (matrix))
GET_PROC_ADDRESS(glMultTransposeMatrixfARB, (const GLfloat* matrix), (matrix))
#endif /* GL_ARB_transpose_matrix */

/* EXT_abgr */
#ifndef GL_EXT_abgr
#define GL_EXT_abgr                         1
#define GL_ABGR_EXT                         0x8000
#endif /* GL_EXT_abgr */

/* EXT_blend_color */
#ifndef GL_EXT_blend_color
#define GL_EXT_blend_color                  1
#define GL_CONSTANT_COLOR_EXT               0x8001
#define GL_ONE_MINUS_CONSTANT_COLOR_EXT     0x8002
#define GL_CONSTANT_ALPHA_EXT               0x8003
#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT     0x8004
#define GL_BLEND_COLOR_EXT                  0x8005
GET_PROC_ADDRESS(glBlendColorEXT, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha), (red, green, blue, alpha))
#endif /* GL_EXT_blend_color */

/* EXT_blend_minmax */
#ifndef GL_EXT_blend_minmax
#define GL_EXT_blend_minmax                 1
#define GL_FUNC_ADD_EXT                     0x8006
#define GL_MIN_EXT                          0x8007
#define GL_MAX_EXT                          0x8008
#define GL_BLEND_EQUATION_EXT               0x8009
GET_PROC_ADDRESS(glBlendEquationEXT, (GLenum mode), (mode))
#endif /* GL_EXT_blend_minmax */

/* EXT_blend_subtract */
#ifndef GL_EXT_blend_subtract
#define GL_EXT_blend_subtract               1
#define GL_FUNC_SUBTRACT_EXT                0x8006
#define GL_FUNC_REVERSE_SUBTRACT_EXT        0x8007
#endif /* GL_EXT_blend_subtract */

/* EXT_clip_volume_hint */
#ifndef GL_EXT_clip_volume_hint
#define GL_EXT_clip_volume_hint             1
#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT    0x80F0
#endif /* GL_EXT_clip_volume_hint */

/* EXT_compiled_vertex_array */
#ifndef GL_EXT_compiled_vertex_array
#define GL_EXT_compiled_vertex_array        1
#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT     0x81A8
#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT     0x81A9
GET_PROC_ADDRESS(glLockArraysEXT, (GLint first, GLsizei count), (first, count))
GET_PROC_ADDRESS(glUnlockArraysEXT, (), ())
#endif /* GL_EXT_compiled_vertex_array */

/* EXT_cull_vertex */
#ifndef GL_EXT_cull_vertex
#define GL_EXT_cull_vertex                  1
#define GL_CULL_VERTEX_EXT                  0x81AA
#define GL_CULL_VERTEX_EYE_POSITION_EXT     0x81AB
#define GL_CULL_VERTEX_OBJECT_POSITION_EXT  0x81AC
GET_PROC_ADDRESS(glCullParameterdvEXT, (GLenum pname, const GLdouble* params), (pname, params))
GET_PROC_ADDRESS(glCullParameterfvEXT, (GLenum pname, const GLfloat* params), (pname, params))
#endif /* GL_EXT_cull_vertex */

/* EXT_fog_coord */
#ifndef GL_EXT_fog_coord
#define GL_EXT_fog_coord                    1
#define GL_FOG_COORDINATE_SOURCE_EXT        0x8450
#define GL_FOG_COORDINATE_EXT               0x8451
#define GL_FRAGMENT_DEPTH_EXT               0x8452
#define GL_CURRENT_FOG_COORDINATE_EXT       0x8453
#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT    0x8454
#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT  0x8455
#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456
#define GL_FOG_COORDINATE_ARRAY_EXT         0x8457
GET_PROC_ADDRESS(glFogCoorddEXT, (GLdouble coord), (coord))
GET_PROC_ADDRESS(glFogCoorddvEXT, (const GLdouble* coord), (coord))
GET_PROC_ADDRESS(glFogCoordfEXT, (GLfloat coord), (coord))
GET_PROC_ADDRESS(glFogCoordfvEXT, (const GLfloat* coord), (coord))
GET_PROC_ADDRESS(glFogCoordPointerEXT, (GLenum type, GLsizei stride, const GLvoid* pointer), (type, stride, pointer))
#endif /* GL_EXT_fog_coord */

/* EXT_light_max_exponent */
#ifndef GL_EXT_light_max_exponent
#define GL_EXT_light_max_exponent           1
#define GL_MAX_SHININESS_EXT                0x8507
#define GL_MAX_SPOT_EXPONENT_EXT            0x8508
#endif /* GL_EXT_light_max_exponent */

/* EXT_packed_pixels */
#ifndef GL_EXT_packed_pixels
#define GL_EXT_packed_pixels                1
#define GL_UNSIGNED_BYTE_3_3_2_EXT          0x8032
#define GL_UNSIGNED_SHORT_4_4_4_4_EXT       0x8033
#define GL_UNSIGNED_SHORT_5_5_5_1_EXT       0x8034
#define GL_UNSIGNED_INT_8_8_8_8_EXT         0x8035
#define GL_UNSIGNED_INT_10_10_10_2_EXT      0x8036
#endif /* GL_EXT_packed_pixels */

/* EXT_paletted_texture */
/* already defined in the Microsoft version of GL/gl.h
   #ifndef GL_EXT_paletted_texture
   #define GL_EXT_paletted_texture             1
   #define GL_COLOR_INDEX1_EXT                 0x80E2
   #define GL_COLOR_INDEX2_EXT                 0x80E3
   #define GL_COLOR_INDEX4_EXT                 0x80E4
   #define GL_COLOR_INDEX8_EXT                 0x80E5
   #define GL_COLOR_INDEX12_EXT                0x80E6
   #define GL_COLOR_INDEX16_EXT                0x80E7
   #define GL_COLOR_TABLE_FORMAT_EXT           0x80D8
   #define GL_COLOR_TABLE_WIDTH_EXT            0x80D9
   #define GL_COLOR_TABLE_RED_SIZE_EXT         0x80DA
   #define GL_COLOR_TABLE_GREEN_SIZE_EXT       0x80DB
   #define GL_COLOR_TABLE_BLUE_SIZE_EXT        0x80DC
   #define GL_COLOR_TABLE_ALPHA_SIZE_EXT       0x80DD
   #define GL_COLOR_TABLE_LUMINANCE_SIZE_EXT   0x80DE
   #define GL_COLOR_TABLE_INTENSITY_SIZE_EXT   0x80DF */
#define GL_TEXTURE_INDEX_SIZE_EXT           0x80ED
GET_PROC_ADDRESS(glColorTableEXT, (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const GLvoid* data), (target, internalFormat, width, format, type, data))
GET_PROC_ADDRESS(glColorSubTableEXT, (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const GLvoid* data), (target, start, count, format, type, data))
GET_PROC_ADDRESS(glGetColorTableEXT, (GLenum target, GLenum format, GLenum type, GLvoid* data), (target, format, type, data))
GET_PROC_ADDRESS(glGetColorTableParameterivEXT, (GLenum target, GLenum pname, GLint* params), (target, pname, params))
GET_PROC_ADDRESS(glGetColorTableParameterfvEXT, (GLenum target, GLenum pname, GLfloat* params), (target, pname, params))
/* #endif GL_EXT_paletted_texture */

/* EXT_point_parameters */
#ifndef GL_EXT_point_parameters
#define GL_EXT_point_parameters             1
#define GL_POINT_SIZE_MIN_EXT               0x8126
#define GL_POINT_SIZE_MAX_EXT               0x8127
#define GL_POINT_FADE_THRESHOLD_SIZE_EXT    0x8128
#define GL_DISTANCE_ATTENUATION_EXT         0x8129
GET_PROC_ADDRESS(glPointParameterfEXT, (GLenum pname, GLfloat param), (pname, param))
GET_PROC_ADDRESS(glPointParameterfvEXT, (GLenum pname, const GLfloat* params), (pname, params))
#endif /* GL_EXT_point_parameters */

/* EXT_rescale_normal */
#ifndef GL_EXT_rescale_normal
#define GL_EXT_rescale_normal               1
#define GL_RESCALE_NORMAL_EXT               0x803A
#endif /* GL_EXT_rescale_normal */

/* EXT_secondary_color */
#ifndef GL_EXT_secondary_color
#define GL_EXT_secondary_color               1
#define GL_COLOR_SUM_EXT                     0x8458
#define GL_CURRENT_SECONDARY_COLOR_EXT       0x8459
#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT    0x845A
#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT    0x845B
#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT  0x845C
#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D
#define GL_SECONDARY_COLOR_ARRAY_EXT         0x845E
GET_PROC_ADDRESS(glSecondaryColor3bEXT, (GLbyte red, GLbyte green, GLbyte blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3bvEXT, (const GLbyte* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3dEXT, (GLdouble red, GLdouble green, GLdouble blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3dvEXT, (const GLdouble* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3fEXT, (GLfloat red, GLfloat green, GLfloat blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3fvEXT, (const GLfloat* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3iEXT, (GLint red, GLint green, GLint blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3ivEXT, (const GLint* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3sEXT, (GLshort red, GLshort green, GLshort blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3svEXT, (const GLshort* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3ubEXT, (GLubyte red, GLubyte green, GLubyte blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3ubvEXT, (const GLubyte* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3uiEXT, (GLuint red, GLuint green, GLuint blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3uivEXT, (const GLuint* components), (components))
GET_PROC_ADDRESS(glSecondaryColor3usEXT, (GLushort red, GLushort green, GLushort blue), (red, green, blue))
GET_PROC_ADDRESS(glSecondaryColor3usvEXT, (const GLushort* components), (components))
GET_PROC_ADDRESS(glSecondaryColorPointerEXT, (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer), (size, type, stride, pointer))
#endif /* GL_EXT_secondary_color */

/* EXT_separate_specular_color */
#ifndef GL_EXT_separate_specular_color
#define GL_EXT_separate_specular_color      1
#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT    0x81F8
#define GL_SINGLECOLOR_EXT                  0x81F9
#define GL_SEPARATE_SPECULAR_COLOR_EXT      0x81FA
#endif /* GL_EXT_separate_specular_color */

/* EXT_shared_texture_palette */
#ifndef GL_EXT_shared_texture_palette
#define GL_EXT_shared_texture_palette       1
#define GL_SHARED_TEXTURE_PALETTE_EXT       0x81FB
#endif /* GL_EXT_shared_texture_palette */

/* EXT_stencil_wrap */
#ifndef GL_EXT_stencil_wrap
#define GL_EXT_stencil_wrap                 1
#define GL_INCR_WRAP_EXT                    0x8507
#define GL_DECR_WRAP_EXT                    0x8508
#endif /* GL_EXT_stencil_wrap */

/* EXT_texture_cube_map */ 
#ifndef GL_EXT_texture_cube_map 
#define GL_EXT_texture_cube_map             1 
#define GL_NORMAL_MAP_EXT                   0x8511 
#define GL_REFLECTION_MAP_EXT               0x8512 
#define GL_TEXTURE_CUBE_MAP_EXT             0x8513 
#define GL_TEXTURE_BINDING_CUBE_MAP_EXT     0x8514 
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT  0x8515 
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT  0x8516 
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT  0x8517 
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT  0x8518 
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT  0x8519 
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT  0x851A 
#define GL_PROXY_TEXTURE_CUBE_MAP_EXT       0x851B 
#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT    0x851C 
#endif /* GL_EXT_texture_cube_map */

/* EXT_texture_edge_clamp */
#ifndef GL_EXT_texture_edge_clamp
#define GL_EXT_texture_edge_clamp           1
#define GL_CLAMP_TO_EDGE_EXT                0x812F
#endif /* GL_EXT_texture_edge_clamp */

/* EXT_texture_env_add */
#ifndef GL_EXT_texture_env_add
#define GL_EXT_texture_env_add              1
#endif /* GL_EXT_texture_env_add */

/* EXT_texture_env_combine */
#ifndef GL_EXT_texture_env_combine
#define GL_EXT_texture_env_combine          1
#define GL_COMBINE_EXT                      0x8570
#define GL_COMBINE_RGB_EXT                  0x8571
#define GL_COMBINE_ALPHA_EXT                0x8572
#define GL_RGB_SCALE_EXT                    0x8573
#define GL_ADD_SIGNED_EXT                   0x8574
#define GL_INTERPOLATE_EXT                  0x8575
#define GL_CONSTANT_EXT                     0x8576
#define GL_PRIMARY_COLOR_EXT                0x8577
#define GL_PREVIOUS_EXT                     0x8578
#define GL_SOURCE0_RGB_EXT                  0x8580
#define GL_SOURCE1_RGB_EXT                  0x8581
#define GL_SOURCE2_RGB_EXT                  0x8582
#define GL_SOURCE0_ALPHA_EXT                0x8588
#define GL_SOURCE1_ALPHA_EXT                0x8589
#define GL_SOURCE2_ALPHA_EXT                0x858A
#define GL_OPERAND0_RGB_EXT                 0x8590
#define GL_OPERAND1_RGB_EXT                 0x8591
#define GL_OPERAND2_RGB_EXT                 0x8592
#define GL_OPERAND0_ALPHA_EXT               0x8598
#define GL_OPERAND1_ALPHA_EXT               0x8599
#define GL_OPERAND2_ALPHA_EXT               0x859A
#endif /* GL_EXT_texture_env_combine */

/* EXT_texture_filter_anisotropic */
#ifndef GL_EXT_texture_filter_anisotropic
#define GL_EXT_texture_filter_anisotropic   1
#define GL_TEXTURE_MAX_ANISOTROPY_EXT       0x84FE
#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT   0x84FF
#endif /* GL_EXT_texture_filter_anisotropic */

/* EXT_texture_lod_bias */
#ifndef GL_EXT_texture_lod_bias
#define GL_EXT_texture_lod_bias             1
#define GL_TEXTURE_FILTER_CONTROL_EXT       0x8500
#define GL_TEXTURE_LOD_BIAS_EXT             0x8501
#define GL_MAX_TEXTURE_LOD_BIAS_EXT         0x84FD
#endif /* GL_EXT_texture_lod_bias */

/* EXT_vertex_array */
/* already defined in the Microsoft version of GL/gl.h
   #ifndef GL_EXT_vertex_array
   #define GL_EXT_vertex_array                 1
   #define GL_VERTEX_ARRAY_EXT                 0x8074
   #define GL_NORMAL_ARRAY_EXT                 0x8075
   #define GL_COLOR_ARRAY_EXT                  0x8076
   #define GL_INDEX_ARRAY_EXT                  0x8077
   #define GL_TEXTURE_COORD_ARRAY_EXT          0x8078
   #define GL_EDGE_FLAG_ARRAY_EXT              0x8079
   #define GL_VERTEX_ARRAY_SIZE_EXT            0x807A
   #define GL_VERTEX_ARRAY_TYPE_EXT            0x807B
   #define GL_VERTEX_ARRAY_STRIDE_EXT          0x807C
   #define GL_VERTEX_ARRAY_COUNT_EXT           0x807D
   #define GL_NORMAL_ARRAY_TYPE_EXT            0x807E
   #define GL_NORMAL_ARRAY_STRIDE_EXT          0x807F
   #define GL_NORMAL_ARRAY_COUNT_EXT           0x8080
   #define GL_COLOR_ARRAY_SIZE_EXT             0x8081
   #define GL_COLOR_ARRAY_TYPE_EXT             0x8082
   #define GL_COLOR_ARRAY_STRIDE_EXT           0x8083
   #define GL_COLOR_ARRAY_COUNT_EXT            0x8084
   #define GL_INDEX_ARRAY_TYPE_EXT             0x8085
   #define GL_INDEX_ARRAY_STRIDE_EXT           0x8086
   #define GL_INDEX_ARRAY_COUNT_EXT            0x8087
   #define GL_TEXTURE_COORD_ARRAY_SIZE_EXT     0x8088
   #define GL_TEXTURE_COORD_ARRAY_TYPE_EXT     0x8089
   #define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT   0x808A
   #define GL_TEXTURE_COORD_ARRAY_COUNT_EXT    0x808B
   #define GL_EDGE_FLAG_ARRAY_STRIDE_EXT       0x808C
   #define GL_EDGE_FLAG_ARRAY_COUNT_EXT        0x808D
   #define GL_VERTEX_ARRAY_POINTER_EXT         0x808E
   #define GL_NORMAL_ARRAY_POINTER_EXT         0x808F
   #define GL_COLOR_ARRAY_POINTER_EXT          0x8090
   #define GL_INDEX_ARRAY_POINTER_EXT          0x8091
   #define GL_TEXTURE_COORD_ARRAY_POINTER_EXT  0x8092
   #define GL_EDGE_FLAG_ARRAY_POINTER_EXT      0x8093 */
GET_PROC_ADDRESS(glArrayElementEXT, (GLint i), (i))
GET_PROC_ADDRESS(glColorPointerEXT, (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid* pointer), (size, type, stride, count, pointer))
GET_PROC_ADDRESS(glDrawArraysEXT, (GLenum mode, GLint first, GLsizei count), (mode, first, count))
GET_PROC_ADDRESS(glEdgeFlagPointerEXT, (GLsizei stride, GLsizei count, const GLboolean* pointer), (stride, count, pointer))
GET_PROC_ADDRESS(glGetPointervEXT, (GLenum pname, GLvoid* params), (pname, params))
GET_PROC_ADDRESS(glIndexPointerEXT, (GLenum type, GLsizei stride, GLsizei count, const GLvoid* pointer), (type, stride, count, pointer))
GET_PROC_ADDRESS(glNormalPointerEXT, (GLenum type, GLsizei stride, GLsizei count, const GLvoid* pointer), (type, stride, count, pointer))
GET_PROC_ADDRESS(glTexCoordPointerEXT, (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid* pointer), (size, type, stride, count, pointer))
GET_PROC_ADDRESS(glVertexPointerEXT, (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid* pointer), (size, type, stride, count, pointer))
/* #endif GL_EXT_vertex_array */

/* EXT_vertex_weighting */
#ifndef GL_EXT_vertex_weighting
#define GL_EXT_vertex_weighting             1
#define GL_VERTEX_WEIGHTING_EXT             0x8509
#define GL_MODELVIEW0_EXT                   0x1700
#define GL_MODELVIEW1_EXT                   0x850a
#define GL_CURRENT_VERTEX_WEIGHT_EXT        0x850b
#define GL_VERTEX_WEIGHT_ARRAY_EXT          0x850c
#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT     0x850d
#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT     0x850e
#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT   0x850f
#define GL_MODELVIEW0_STACK_DEPTH_EXT       0x0BA3
#define GL_MODELVIEW1_STACK_DEPTH_EXT       0x8502
#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT  0x8510
GET_PROC_ADDRESS(glVertexWeightfEXT, (GLfloat weight), (weight))
GET_PROC_ADDRESS(glVertexWeightfvEXT, (GLfloat *weight), (weight))
GET_PROC_ADDRESS(glVertexWeightPointerEXT, (GLint size, GLenum type, GLsizei stride, const GLvoid* pointer), (size, type, stride, pointer))
#endif /* GL_EXT_vertex_weighting */

/* NV_fog_distance */
#ifndef GL_NV_fog_distance
#define GL_NV_fog_distance                  1
#define GL_FOG_DISTANCE_MODE_NV             0x855A
#define GL_EYE_RADIAL_NV                    0x855B
#define GL_EYE_PLANE_ABSOLUTE_NV            0x855C
#endif /* GL_NV_fog_distance */

/* NV_light_max_exponent */
#ifndef GL_NV_light_max_exponent
#define GL_NV_light_max_exponent            1
#define GL_MAX_SHININESS_NV                 0x8507
#define GL_MAX_SPOT_EXPONENT_NV             0x8508
#endif /* GL_NV_light_max_exponent */

/* NV_register_combiners */
#ifndef GL_NV_register_combiners
#define GL_NV_register_combiners            1
#define GL_REGISTER_COMBINERS_NV            0x8522
#define GL_COMBINER0_NV                     0x8550
#define GL_COMBINER1_NV                     0x8551
#define GL_COMBINER2_NV                     0x8552
#define GL_COMBINER3_NV                     0x8553
#define GL_COMBINER4_NV                     0x8554
#define GL_COMBINER5_NV                     0x8555
#define GL_COMBINER6_NV                     0x8556
#define GL_COMBINER7_NV                     0x8557
#define GL_VARIABLE_A_NV                    0x8523
#define GL_VARIABLE_B_NV                    0x8524
#define GL_VARIABLE_C_NV                    0x8525
#define GL_VARIABLE_D_NV                    0x8526
#define GL_VARIABLE_E_NV                    0x8527
#define GL_VARIABLE_F_NV                    0x8528
#define GL_VARIABLE_G_NV                    0x8529
#define GL_CONSTANT_COLOR0_NV               0x852A
#define GL_CONSTANT_COLOR1_NV               0x852B
#define GL_PRIMARY_COLOR_NV                 0x852C
#define GL_SECONDARY_COLOR_NV               0x852D
#define GL_SPARE0_NV                        0x852E
#define GL_SPARE1_NV                        0x852F
#define GL_UNSIGNED_IDENTITY_NV             0x8536
#define GL_UNSIGNED_INVERT_NV               0x8537
#define GL_EXPAND_NORMAL_NV                 0x8538
#define GL_EXPAND_NEGATE_NV                 0x8539
#define GL_HALF_BIAS_NORMAL_NV              0x853A
#define GL_HALF_BIAS_NEGATE_NV              0x853B
#define GL_SIGNED_IDENTITY_NV               0x853C
#define GL_SIGNED_NEGATE_NV                 0x853D
#define GL_E_TIMES_F_NV                     0x8531
#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV   0x8532
#define GL_SCALE_BY_TWO_NV                  0x853E
#define GL_SCALE_BY_FOUR_NV                 0x853F
#define GL_SCALE_BY_ONE_HALF_NV             0x8540
#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV     0x8541
#define GL_DISCARD_NV                       0x8530
#define GL_COMBINER_INPUT_NV                0x8542
#define GL_COMBINER_MAPPING_NV              0x8543
#define GL_COMBINER_COMPONENT_USAGE_NV      0x8544
#define GL_COMBINER_AB_DOT_PRODUCT_NV       0x8545
#define GL_COMBINER_CD_DOT_PRODUCT_NV       0x8546
#define GL_COMBINER_MUX_SUM_NV              0x8547
#define GL_COMBINER_SCALE_NV                0x8548
#define GL_COMBINER_BIAS_NV                 0x8549
#define GL_COMBINER_AB_OUTPUT_NV            0x854A
#define GL_COMBINER_CD_OUTPUT_NV            0x854B
#define GL_COMBINER_SUM_OUTPUT_NV           0x854C
#define GL_MAX_GENERAL_COMBINERS_NV         0x854D
#define GL_NUM_GENERAL_COMBINERS_NV         0x854E
#define GL_COLOR_SUM_CLAMP_NV               0x854F
GET_PROC_ADDRESS(glCombinerParameterfNV, (GLenum pname, GLfloat param), (pname, param))
GET_PROC_ADDRESS(glCombinerParameterfvNV, (GLenum pname, const GLfloat* params), (pname, params))
GET_PROC_ADDRESS(glCombinerParameteriNV, (GLenum pname, GLint param), (pname, param))
GET_PROC_ADDRESS(glCombinerParameterivNV, (GLenum pname, const GLint* params), (pname, params))
GET_PROC_ADDRESS(glCombinerInputNV, (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage), (stage, portion, variable, input, mapping, componentUsage))
GET_PROC_ADDRESS(glCombinerOutputNV, (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum), (stage, portion, abOutput, cdOutput, sumOutput, scale, bias, abDotProduct, cdDotProduct, muxSum))
GET_PROC_ADDRESS(glFinalCombinerInputNV, (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage), (variable, input, mapping, componentUsage))
GET_PROC_ADDRESS(glGetCombinerInputParameterfvNV, (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat* params), (stage, portion, variable, pname, params))
GET_PROC_ADDRESS(glGetCombinerInputParameterivNV, (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint* params), (stage, portion, variable, pname, params))
GET_PROC_ADDRESS(glGetCombinerOutputParameterfvNV, (GLenum stage, GLenum portion, GLenum pname, GLfloat* params), (stage, portion, pname, params))
GET_PROC_ADDRESS(glGetCombinerOutputParameterivNV, (GLenum stage, GLenum portion, GLenum pname, GLint* params), (stage, portion, pname, params))
GET_PROC_ADDRESS(glGetFinalCombinerInputParameterfvNV, (GLenum variable, GLenum pname, GLfloat* params), (variable, pname, params))
GET_PROC_ADDRESS(glGetFinalCombinerInputParameterivNV, (GLenum variable, GLenum pname, GLint* params), (variable, pname, params))
#endif /* GL_NV_register_combiners */

/* NV_texgen_emboss */
#ifndef GL_NV_texgen_emboss
#define GL_NV_texgen_emboss                 1
#define GL_EMBOSS_MAP_NV                    0x855F
#define GL_EMBOSS_LIGHT_NV                  0x855D
#define GL_EMBOSS_CONSTANT_NV               0x855E
#endif /* GL_NV_texgen_emboss */

/* NV_texgen_reflection */
#ifndef GL_NV_texgen_reflection
#define GL_NV_texgen_reflection             1
#define GL_NORMAL_MAP_NV                    0x8511
#define GL_REFLECTION_MAP_NV                0x8512
#endif /* GL_NV_texgen_reflection */

/* NV_texture_env_combine4 */
#ifndef GL_NV_texture_env_combine4
#define GL_NV_texture_env_combine4          1
#define GL_COMBINE4_NV                      0x8503
#define GL_SOURCE3_RGB_NV                   0x8583
#define GL_SOURCE3_ALPHA_NV                 0x858B
#define GL_OPERAND3_RGB_NV                  0x8593
#define GL_OPERAND3_ALPHA_NV                0x859B
#endif /* GL_NV_texture_env_combine4 */

/* NV_vertex_array_range */
#ifndef GL_NV_vertex_array_range
#define GL_NV_vertex_array_range            1
#define GL_VERTEX_ARRAY_RANGE_NV             0x851D
#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV      0x851E
#define GL_VERTEX_ARRAY_RANGE_VALID_NV       0x851F
#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520
#define GL_VERTEX_ARRAY_RANGE_POINTER_NV     0x8521
GET_PROC_ADDRESS(glVertexArrayRangeNV, (GLsizei length, const GLvoid* pointer), (length, pointer))
GET_PROC_ADDRESS(glFlushVertexArrayRangeNV, (void), ())
#endif /* GL_NV_vertex_array_range */

/* S3_s3tc */
#ifndef GL_S3_s3tc
#define GL_S3_s3tc                          1
#define GL_RGB_S3TC                         0x83A0
#define GL_RGB4_S3TC                        0x83A1
#define GL_RGBA_S3TC                        0x83A2
#define GL_RGBA4_S3TC                       0x83A3
#endif /* GL_S3_s3tc */

/* ARB_extensions_string */
#ifndef WGL_ARB_extensions_string
#define WGL_ARB_extensions_string
GET_PROC_ADDRESS_2(char*, wglGetExtensionsStringARB, (HDC hdc), (hdc))
#endif /* WGL_ARB_extensions_string */


/* ARB_pixel_format  */
#ifndef WGL_ARB_pixel_format 
#define WGL_ARB_pixel_format 
#define WGL_NUMBER_PIXEL_FORMATS_ARB		0x2000
#define WGL_DRAW_TO_WINDOW_ARB				0x2001
#define WGL_DRAW_TO_BITMAP_ARB				0x2002
#define WGL_ACCELERATION_ARB				0x2003
#define WGL_NEED_PALETTE_ARB				0x2004
#define WGL_NEED_SYSTEM_PALETTE_ARB			0x2005
#define WGL_SWAP_LAYER_BUFFERS_ARB			0x2006
#define WGL_SWAP_METHOD_ARB					0x2007
#define WGL_NUMBER_OVERLAYS_ARB				0x2008
#define WGL_NUMBER_UNDERLAYS_ARB			0x2009
#define WGL_TRANSPARENT_ARB					0x200A
#define WGL_TRANSPARENT_RED_VALUE_ARB		0x2037
#define WGL_TRANSPARENT_GREEN_VALUE_ARB		0x2038
#define WGL_TRANSPARENT_BLUE_VALUE_ARB		0x2039
#define WGL_TRANSPARENT_ALPHA_VALUE_ARB		0x203A
#define WGL_TRANSPARENT_INDEX_VALUE_ARB		0x203B
#define WGL_SHARE_DEPTH_ARB					0x200C
#define WGL_SHARE_STENCIL_ARB				0x200D
#define WGL_SHARE_ACCUM_ARB					0x200E
#define WGL_SUPPORT_GDI_ARB					0x200F
#define WGL_SUPPORT_OPENGL_ARB				0x2010
#define WGL_DOUBLE_BUFFER_ARB				0x2011
#define WGL_STEREO_ARB						0x2012
#define WGL_PIXEL_TYPE_ARB					0x2013
#define WGL_COLOR_BITS_ARB					0x2014
#define WGL_RED_BITS_ARB					0x2015
#define WGL_RED_SHIFT_ARB					0x2016
#define WGL_GREEN_BITS_ARB					0x2017
#define WGL_GREEN_SHIFT_ARB					0x2018
#define WGL_BLUE_BITS_ARB					0x2019
#define WGL_BLUE_SHIFT_ARB					0x201A
#define WGL_ALPHA_BITS_ARB					0x201B
#define WGL_ALPHA_SHIFT_ARB					0x201C
#define WGL_ACCUM_BITS_ARB					0x201D
#define WGL_ACCUM_RED_BITS_ARB				0x201E
#define WGL_ACCUM_GREEN_BITS_ARB			0x201F
#define WGL_ACCUM_BLUE_BITS_ARB				0x2020
#define WGL_ACCUM_ALPHA_BITS_ARB			0x2021
#define WGL_DEPTH_BITS_ARB					0x2022
#define WGL_STENCIL_BITS_ARB				0x2023
#define WGL_AUX_BUFFERS_ARB					0x2024
#define WGL_NO_ACCELERATION_ARB				0x2025
#define WGL_GENERIC_ACCELERATION_ARB		0x2026
#define WGL_FULL_ACCELERATION_ARB			0x2027
#define WGL_SWAP_EXCHANGE_ARB				0x2028
#define WGL_SWAP_COPY_ARB					0x2029
#define WGL_SWAP_UNDEFINED_ARB				0x202A
#define WGL_TYPE_RGBA_ARB					0x202B
#define WGL_TYPE_COLORINDEX_ARB				0x202C
GET_PROC_ADDRESS_2(BOOL, wglGetPixelFormatAttribivARB, (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, int *piValues), (hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, piValues))
GET_PROC_ADDRESS_2(BOOL, wglGetPixelFormatAttribfvARB, (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int *piAttributes, FLOAT *pfValues), (hdc, iPixelFormat, iLayerPlane, nAttributes, piAttributes, pfValues))
GET_PROC_ADDRESS_2(BOOL, wglChoosePixelFormatARB, (HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats), (hdc, piAttribIList, pfAttribFList, nMaxFormats, piFormats, nNumFormats))
#endif /* WGL_ARB_pixel_format */

/* ARB_make_current_read */
#ifndef WGL_ARB_make_current_read
#define WGL_ARB_make_current_read
#define ERROR_INVALID_PIXEL_TYPE_ARB			0x2043
#define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB	0x2054
GET_PROC_ADDRESS_2(BOOL, wglMakeContextCurrentARB, (HDC hDrawDC, HDC hReadDC, HGLRC hglrc), (hDrawDC, hReadDC, hglrc))
GET_PROC_ADDRESS_2(HDC, wglGetCurrentReadDCARB, (VOID), ())
#endif /* WGL_ARB_make_current_read */

/* ARB_pbuffer */
#ifndef WGL_ARB_pbuffer
#define WGL_ARB_pbuffer
#define WGL_DRAW_TO_PBUFFER_ARB		   0x202D
#define WGL_DRAW_TO_PBUFFER_ARB		   0x202D
#define WGL_MAX_PBUFFER_PIXELS_ARB	   0x202E
#define WGL_MAX_PBUFFER_WIDTH_ARB	   0x202F
#define WGL_MAX_PBUFFER_HEIGHT_ARB	   0x2030
#define WGL_PBUFFER_LARGEST_ARB		   0x2033
#define WGL_PBUFFER_WIDTH_ARB		   0x2034
#define WGL_PBUFFER_HEIGHT_ARB		   0x2035
#define WGL_PBUFFER_LOST_ARB		   0x2036
DECLARE_HANDLE(HPBUFFERARB);
GET_PROC_ADDRESS_2(HPBUFFERARB, wglCreatePbufferARB, (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int *piAttribList), (hDC, iPixelFormat, iWidth, iHeight, piAttribList));
GET_PROC_ADDRESS_2(HDC, wglGetPbufferDCARB, (HPBUFFERARB hPbuffer), (hPbuffer));
GET_PROC_ADDRESS_2(int, wglReleasePbufferDCARB, (HPBUFFERARB hPbuffer, HDC hDC), (hPbuffer, hDC));
GET_PROC_ADDRESS_2(BOOL, wglDestroyPbufferARB, (HPBUFFERARB hPbuffer), (hPbuffer));
GET_PROC_ADDRESS_2(BOOL, wglQueryPbufferARB, (HPBUFFERARB hPbuffer, int iAttribute, int *piValue), (hPbuffer, iAttribute, piValue));
#endif /* WGL_ARB_pbuffer */

/* ARB_multisample */
#ifndef WGL_ARB_multisample
#define WGL_ARB_multisample
#define GLX_SAMPLE_BUFFERS_ARB					100000
#define GLX_SAMPLES_ARB							100001
#define WGL_SAMPLE_BUFFERS_ARB					0x2041
#define WGL_SAMPLES_ARB							0x2042
#define GL_MULTISAMPLE_ARB						0x809D
#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB			0x809E
#define GL_SAMPLE_ALPHA_TO_ONE_ARB				0x809F
#define GL_SAMPLE_COVERAGE_ARB					0x80A0
#define GL_MULTISAMPLE_BIT_ARB					0x20000000
#define GL_SAMPLE_BUFFERS_ARB					0x80A8
#define GL_SAMPLES_ARB							0x80A9
#define GL_SAMPLE_COVERAGE_VALUE_ARB			0x80AA
#define GL_SAMPLE_COVERAGE_INVERT_ARB			0x80AB
GET_PROC_ADDRESS(glSampleCoverageARB, (GLclampf value, GLboolean invert), (value, invert));
#endif /* WGL_ARB_multisample */

/* WIN_swap_hint */
/* already defined in the Microsoft version of GL/gl.h
   #ifndef GL_WIN_swap_hint
   #define GL_WIN_swap_hint                    1 */
GET_PROC_ADDRESS(glAddSwapHintRectWIN, (GLint x, GLint y, GLsizei width, GLsizei height), (x, y, width, height))
/* #endif GL_WIN_swap_hint */

#undef GET_PROC_ADDRESS

#ifdef __cplusplus
}
#else /* __cplusplus */
#undef inline
#endif /* __cplusplus */

#endif /* WIN32 */

#endif /* _GLEXT_H_ */


