"""Implementation of the special "glGet" functions

For comparison, here's what a straightforward implementation looks like:

    def glGetDoublev( pname ):
        "Natural writing of glGetDoublev using standard ctypes"
        output = c_double*sizes.get( pname )
        result = output()
        result = platform.OpenGL.glGetDoublev( pname, byref(result) )
        return Numeric.array( result )
"""
from OpenGL import platform, arrays, error, wrapper, converters
from OpenGL.raw import GL as simple
import ctypes
GLenum = ctypes.c_uint
GLsize = GLsizei = ctypes.c_int

__all__ = (
    'glGetBoolean','glGetBooleanv','glGetInteger','glGetIntegerv',
    'glGetFloat','glGetFloatv','glGetDouble','glGetDoublev',
    'glGetString',
    'glGetLightfv','glGetLightiv',
    'glGetMaterialfv','glGetMaterialiv',
    'glGetPixelMapfv','glGetPixelMapusv','glGetPixelMapuiv',
    'glGetPolygonStipple', 'glGetPolygonStippleub',
    'glGetTexEnviv','glGetTexEnvfv',
    'glGetTexGenfv','glGetTexGeniv','glGetTexGendv',
    'glGetTexLevelParameteriv',
    'glGetTexLevelParameterfv',
    'glGetTexParameterfv',
    'glGetTexParameteriv',
)

glGetString = simple.glGetString
glGetString.restype = ctypes.c_char_p
glGetString.__doc__ = """glGetString( constant ) -> Current string value"""

GL_GET_SIZES = {
    simple.GL_ACCUM_ALPHA_BITS                      : (1,),
    simple.GL_ACCUM_BLUE_BITS                       : (1,),
    simple.GL_ACCUM_CLEAR_VALUE                     : (4,),
    simple.GL_ACCUM_GREEN_BITS                      : (1,),
    simple.GL_ACCUM_RED_BITS                        : (1,),
    simple.GL_ACTIVE_TEXTURE                        : (1,),
    simple.GL_ACTIVE_TEXTURE_ARB                    : (1,),
    simple.GL_ALIASED_LINE_WIDTH_RANGE              : (2,),
    simple.GL_ALIASED_POINT_SIZE_RANGE              : (2,),
    simple.GL_ALPHA_BIAS                            : (1,),
    simple.GL_ALPHA_BITS                            : (1,),
    simple.GL_ALPHA_SCALE                           : (1,),
    simple.GL_ALPHA_TEST                            : (1,),
    simple.GL_ALPHA_TEST_FUNC                       : (1,),
    simple.GL_ALPHA_TEST_REF                        : (1,),
    simple.GL_ARRAY_BUFFER_BINDING                  : (1,),
    simple.GL_ATTRIB_STACK_DEPTH                    : (1,),
    simple.GL_AUTO_NORMAL                           : (1,),
    simple.GL_AUX_BUFFERS                           : (1,),
    simple.GL_BLEND                                 : (1,),
    simple.GL_BLEND_COLOR                           : (4,),
    simple.GL_BLEND_DST_ALPHA                       : (1,),
    simple.GL_BLEND_DST_RGB                         : (1,),
    simple.GL_BLEND_EQUATION_RGB                    : (1,),
    simple.GL_BLEND_EQUATION_ALPHA                  : (1,),
    simple.GL_BLEND_SRC_RGB                         : (1,),
    simple.GL_BLEND_SRC_ALPHA                       : (1,),
    simple.GL_BLUE_BIAS                             : (1,),
    simple.GL_BLUE_BITS                             : (1,),
    simple.GL_BLUE_SCALE                            : (1,),
    simple.GL_CLIENT_ACTIVE_TEXTURE                 : (1,),
    simple.GL_CLIENT_ACTIVE_TEXTURE_ARB             : (1,),
    simple.GL_CLIENT_ATTRIB_STACK_DEPTH             : (1,),
    simple.GL_CLIP_PLANE0                           : (1,),
    simple.GL_CLIP_PLANE1                           : (1,),
    simple.GL_CLIP_PLANE2                           : (1,),
    simple.GL_CLIP_PLANE3                           : (1,),
    simple.GL_CLIP_PLANE4                           : (1,),
    simple.GL_CLIP_PLANE5                           : (1,),
    simple.GL_COLOR_ARRAY                           : (1,),
    simple.GL_COLOR_ARRAY_BUFFER_BINDING            : (1,),
    simple.GL_COLOR_ARRAY_SIZE                      : (1,),
    simple.GL_COLOR_ARRAY_STRIDE                    : (1,),
    simple.GL_COLOR_ARRAY_TYPE                      : (1,),
    simple.GL_COLOR_CLEAR_VALUE                     : (4,),
    simple.GL_COLOR_LOGIC_OP                        : (1,),
    simple.GL_COLOR_MATERIAL                        : (1,),
    simple.GL_COLOR_MATERIAL_FACE                   : (1,),
    simple.GL_COLOR_MATERIAL_PARAMETER              : (1,),
    simple.GL_COLOR_MATRIX                          : (4, 4),
    simple.GL_COLOR_MATRIX_STACK_DEPTH              : (1,),
    simple.GL_COLOR_SUM                             : (1,),
    simple.GL_COLOR_TABLE                           : (1,),
    simple.GL_COLOR_WRITEMASK                       : (4,),
    # TODO: this *requires* a lookup to determine how many will be returned...
    #simple.GL_COMPRESSED_TEXTURE_FORMATS            : (4,),
    simple.GL_CONVOLUTION_1D                        : (1,),
    simple.GL_CONVOLUTION_2D                        : (1,),
    simple.GL_CULL_FACE                             : (1,),
    simple.GL_CULL_FACE_MODE                        : (1,),
    simple.GL_CURRENT_COLOR                         : (4,),
    simple.GL_CURRENT_INDEX                         : (1,),
    simple.GL_CURRENT_NORMAL                        : (3,),
    simple.GL_CURRENT_RASTER_COLOR                  : (4,),
    simple.GL_CURRENT_RASTER_DISTANCE               : (1,),
    simple.GL_CURRENT_RASTER_INDEX                  : (1,),
    simple.GL_CURRENT_RASTER_POSITION               : (4,),
    simple.GL_CURRENT_RASTER_POSITION_VALID         : (1,),
    simple.GL_CURRENT_RASTER_TEXTURE_COORDS         : (4,),
    simple.GL_CURRENT_SECONDARY_COLOR               : (4,),
    simple.GL_CURRENT_TEXTURE_COORDS                : (4,),
    simple.GL_DEPTH_BIAS                            : (1,),
    simple.GL_DEPTH_BITS                            : (1,),
    simple.GL_DEPTH_CLEAR_VALUE                     : (1,),
    simple.GL_DEPTH_FUNC                            : (1,),
    simple.GL_DEPTH_RANGE                           : (2,),
    simple.GL_DEPTH_SCALE                           : (1,),
    simple.GL_DEPTH_TEST                            : (1,),
    simple.GL_DEPTH_WRITEMASK                       : (1,),
    simple.GL_DITHER                                : (1,),
    simple.GL_DOUBLEBUFFER                          : (1,),
    simple.GL_DRAW_BUFFER                           : (1,),
    simple.GL_EDGE_FLAG                             : (1,),
    simple.GL_EDGE_FLAG_ARRAY                       : (1,),
    simple.GL_EDGE_FLAG_ARRAY_BUFFER_BINDING        : (1,),
    simple.GL_EDGE_FLAG_ARRAY_STRIDE                : (1,),
    simple.GL_ELEMENT_ARRAY_BUFFER_BINDING          : (1,),
    simple.GL_FEEDBACK_BUFFER_SIZE                  : (1,),
    simple.GL_FEEDBACK_BUFFER_TYPE                  : (1,),
    simple.GL_FOG                                   : (1,),
    simple.GL_FOG_COORD_ARRAY                       : (1,),
    simple.GL_FOG_COORD_ARRAY_BUFFER_BINDING        : (1,),
    simple.GL_FOG_COORD_ARRAY_STRIDE                : (1,),
    simple.GL_FOG_COORD_ARRAY_TYPE                  : (1,),
    simple.GL_FOG_COORD_SRC                         : (1,),
    simple.GL_FOG_COLOR                             : (4,),
    simple.GL_FOG_DENSITY                           : (1,),
    simple.GL_FOG_END                               : (1,),
    simple.GL_FOG_HINT                              : (1,),
    simple.GL_FOG_INDEX                             : (1,),
    simple.GL_FOG_MODE                              : (1,),
    simple.GL_FOG_START                             : (1,),
    simple.GL_FRAGMENT_SHADER_DERIVATIVE_HINT       : (1,),
    simple.GL_FRONT_FACE                            : (1,),
    simple.GL_GENERATE_MIPMAP_HINT                  : (1,),
    simple.GL_GREEN_BIAS                            : (1,),
    simple.GL_GREEN_BITS                            : (1,),
    simple.GL_GREEN_SCALE                           : (1,),
    simple.GL_HISTOGRAM                             : (1,),
    simple.GL_INDEX_ARRAY                           : (1,),
    simple.GL_INDEX_ARRAY_BUFFER_BINDING            : (1,),
    simple.GL_INDEX_ARRAY_STRIDE                    : (1,),
    simple.GL_INDEX_ARRAY_TYPE                      : (1,),
    simple.GL_INDEX_BITS                            : (1,),
    simple.GL_INDEX_CLEAR_VALUE                     : (1,),
    simple.GL_INDEX_LOGIC_OP                        : (1,),
    simple.GL_INDEX_MODE                            : (1,),
    simple.GL_INDEX_OFFSET                          : (1,),
    simple.GL_INDEX_SHIFT                           : (1,),
    simple.GL_INDEX_WRITEMASK                       : (1,),
    simple.GL_LIGHT0                                : (1,),
    simple.GL_LIGHT1                                : (1,),
    simple.GL_LIGHT2                                : (1,),
    simple.GL_LIGHT3                                : (1,),
    simple.GL_LIGHT4                                : (1,),
    simple.GL_LIGHT5                                : (1,),
    simple.GL_LIGHT6                                : (1,),
    simple.GL_LIGHT7                                : (1,),
    simple.GL_LIGHTING                              : (1,),
    simple.GL_LIGHT_MODEL_AMBIENT                   : (4,),
    simple.GL_LIGHT_MODEL_COLOR_CONTROL             : (1,),
    simple.GL_LIGHT_MODEL_LOCAL_VIEWER              : (1,),
    simple.GL_LIGHT_MODEL_TWO_SIDE                  : (1,),
    simple.GL_LINE_SMOOTH                           : (1,),
    simple.GL_LINE_SMOOTH_HINT                      : (1,),
    simple.GL_LINE_STIPPLE                          : (1,),
    simple.GL_LINE_STIPPLE_PATTERN                  : (1,),
    simple.GL_LINE_STIPPLE_REPEAT                   : (1,),
    simple.GL_LINE_WIDTH                            : (1,),
    simple.GL_LINE_WIDTH_GRANULARITY                : (1,),
    simple.GL_LINE_WIDTH_RANGE                      : (2,),
    simple.GL_LIST_BASE                             : (1,),
    simple.GL_LIST_INDEX                            : (1,),
    simple.GL_LIST_MODE                             : (1,),
    simple.GL_LOGIC_OP_MODE                         : (1,),
    simple.GL_MAP1_COLOR_4                          : (1,),
    simple.GL_MAP1_GRID_DOMAIN                      : (2,),
    simple.GL_MAP1_GRID_SEGMENTS                    : (1,),
    simple.GL_MAP1_INDEX                            : (1,),
    simple.GL_MAP1_NORMAL                           : (1,),
    simple.GL_MAP1_TEXTURE_COORD_1                  : (1,),
    simple.GL_MAP1_TEXTURE_COORD_2                  : (1,),
    simple.GL_MAP1_TEXTURE_COORD_3                  : (1,),
    simple.GL_MAP1_TEXTURE_COORD_4                  : (1,),
    simple.GL_MAP1_VERTEX_3                         : (1,),
    simple.GL_MAP1_VERTEX_4                         : (1,),
    simple.GL_MAP2_COLOR_4                          : (1,),
    simple.GL_MAP2_GRID_DOMAIN                      : (4,),
    simple.GL_MAP2_GRID_SEGMENTS                    : (2,),
    simple.GL_MAP2_INDEX                            : (1,),
    simple.GL_MAP2_NORMAL                           : (1,),
    simple.GL_MAP2_TEXTURE_COORD_1                  : (1,),
    simple.GL_MAP2_TEXTURE_COORD_2                  : (1,),
    simple.GL_MAP2_TEXTURE_COORD_3                  : (1,),
    simple.GL_MAP2_TEXTURE_COORD_4                  : (1,),
    simple.GL_MAP2_VERTEX_3                         : (1,),
    simple.GL_MAP2_VERTEX_4                         : (1,),
    simple.GL_MAP_COLOR                             : (1,),
    simple.GL_MAP_STENCIL                           : (1,),
    simple.GL_MATRIX_MODE                           : (1,),
    simple.GL_MAX_3D_TEXTURE_SIZE                   : (1,),
    simple.GL_MAX_ATTRIB_STACK_DEPTH                : (1,),
    simple.GL_MAX_CLIENT_ATTRIB_STACK_DEPTH         : (1,),
    simple.GL_MAX_CLIP_PLANES                       : (1,),
    simple.GL_MAX_COLOR_MATRIX_STACK_DEPTH          : (1,),
    simple.GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS      : (1,),
    simple.GL_MAX_CUBE_MAP_TEXTURE_SIZE             : (1,),
    simple.GL_MAX_DRAW_BUFFERS                      : (1,),
    simple.GL_MAX_ELEMENTS_INDICES                  : (1,),
    simple.GL_MAX_ELEMENTS_VERTICES                 : (1,),
    simple.GL_MAX_EVAL_ORDER                        : (1,),
    simple.GL_MAX_LIGHTS                            : (1,),
    simple.GL_MAX_LIST_NESTING                      : (1,),
    simple.GL_MAX_MODELVIEW_STACK_DEPTH             : (1,),
    simple.GL_MAX_NAME_STACK_DEPTH                  : (1,),
    simple.GL_MAX_PIXEL_MAP_TABLE                   : (1,),
    simple.GL_MAX_PROJECTION_STACK_DEPTH            : (1,),
    simple.GL_MAX_TEXTURE_IMAGE_UNITS               : (1,),
    simple.GL_MAX_TEXTURE_LOD_BIAS                  : (1,),
    simple.GL_MAX_TEXTURE_SIZE                      : (1,),
    simple.GL_MAX_TEXTURE_STACK_DEPTH               : (1,),
    simple.GL_MAX_TEXTURE_UNITS                     : (1,),
    simple.GL_MAX_TEXTURE_UNITS_ARB                 : (1,),
    simple.GL_MAX_VARYING_FLOATS                    : (1,),
    simple.GL_MAX_VERTEX_ATTRIBS                    : (1,),
    simple.GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS        : (1,),
    simple.GL_MAX_VERTEX_UNIFORM_COMPONENTS         : (1,),
    simple.GL_MAX_VIEWPORT_DIMS                     : (2,),
    simple.GL_MINMAX                                : (1,),
    simple.GL_MODELVIEW_MATRIX                      : (4, 4),
    simple.GL_MODELVIEW_STACK_DEPTH                 : (1,),
    simple.GL_NAME_STACK_DEPTH                      : (1,),
    simple.GL_NORMALIZE                             : (1,),
    simple.GL_NORMAL_ARRAY                          : (1,),
    simple.GL_NORMAL_ARRAY_BUFFER_BINDING           : (1,),
    simple.GL_NORMAL_ARRAY_STRIDE                   : (1,),
    simple.GL_NORMAL_ARRAY_TYPE                     : (1,),
    simple.GL_NORMALIZE                             : (1,),
    simple.GL_NUM_COMPRESSED_TEXTURE_FORMATS        : (1,),
    simple.GL_PACK_ALIGNMENT                        : (1,),
    simple.GL_PACK_IMAGE_HEIGHT                     : (1,),
    simple.GL_PACK_LSB_FIRST                        : (1,),
    simple.GL_PACK_ROW_LENGTH                       : (1,),
    simple.GL_PACK_SKIP_IMAGES                      : (1,),
    simple.GL_PACK_SKIP_PIXELS                      : (1,),
    simple.GL_PACK_SKIP_ROWS                        : (1,),
    simple.GL_PACK_SWAP_BYTES                       : (1,),
    simple.GL_PERSPECTIVE_CORRECTION_HINT           : (1,),
    simple.GL_PIXEL_MAP_A_TO_A_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_B_TO_B_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_G_TO_G_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_I_TO_A_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_I_TO_B_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_I_TO_G_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_I_TO_I_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_I_TO_R_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_R_TO_R_SIZE                 : (1,),
    simple.GL_PIXEL_MAP_S_TO_S_SIZE                 : (1,),
    simple.GL_PIXEL_PACK_BUFFER_BINDING_ARB         : (1,),
    simple.GL_PIXEL_UNPACK_BUFFER_BINDING_ARB       : (1,),
    simple.GL_POINT_DISTANCE_ATTENUATION            : (3,),
    simple.GL_POINT_FADE_THRESHOLD_SIZE             : (1,),
    simple.GL_POINT_SIZE                            : (1,),
    simple.GL_POINT_SIZE_GRANULARITY                : (1,),
    simple.GL_POINT_SIZE_MAX                        : (1,),
    simple.GL_POINT_SIZE_MIN                        : (1,),
    simple.GL_POINT_SIZE_RANGE                      : (2,),
    simple.GL_POINT_SMOOTH                          : (1,),
    simple.GL_POINT_SMOOTH_HINT                     : (1,),
    simple.GL_POLYGON_MODE                          : (2,),
    simple.GL_POLYGON_OFFSET_FACTOR                 : (1,),
    simple.GL_POLYGON_OFFSET_FILL                   : (1,),
    simple.GL_POLYGON_OFFSET_LINE                   : (1,),
    simple.GL_POLYGON_OFFSET_POINT                  : (1,),
    simple.GL_POLYGON_OFFSET_UNITS                  : (1,),
    simple.GL_POLYGON_SMOOTH                        : (1,),
    simple.GL_POLYGON_SMOOTH_HINT                   : (1,),
    simple.GL_POLYGON_STIPPLE                       : (1,),
    simple.GL_POST_COLOR_MATRIX_ALPHA_BIAS          : (1,),
    simple.GL_POST_COLOR_MATRIX_ALPHA_SCALE         : (1,),
    simple.GL_POST_COLOR_MATRIX_BLUE_BIAS           : (1,),
    simple.GL_POST_COLOR_MATRIX_BLUE_SCALE          : (1,),
    simple.GL_POST_COLOR_MATRIX_COLOR_TABLE         : (1,),
    simple.GL_POST_COLOR_MATRIX_GREEN_BIAS          : (1,),
    simple.GL_POST_COLOR_MATRIX_GREEN_SCALE         : (1,),
    simple.GL_POST_COLOR_MATRIX_RED_BIAS            : (1,),
    simple.GL_POST_COLOR_MATRIX_RED_SCALE           : (1,),
    simple.GL_POST_CONVOLUTION_ALPHA_BIAS           : (1,),
    simple.GL_POST_CONVOLUTION_ALPHA_SCALE          : (1,),
    simple.GL_POST_CONVOLUTION_BLUE_BIAS            : (1,),
    simple.GL_POST_CONVOLUTION_BLUE_SCALE           : (1,),
    simple.GL_POST_CONVOLUTION_COLOR_TABLE          : (1,),
    simple.GL_POST_CONVOLUTION_GREEN_BIAS           : (1,),
    simple.GL_POST_CONVOLUTION_GREEN_SCALE          : (1,),
    simple.GL_POST_CONVOLUTION_RED_BIAS             : (1,),
    simple.GL_POST_CONVOLUTION_RED_SCALE            : (1,),
    simple.GL_PROJECTION_MATRIX                     : (4, 4),
    simple.GL_PROJECTION_STACK_DEPTH                : (1,),
    simple.GL_READ_BUFFER                           : (1,),
    simple.GL_RED_BIAS                              : (1,),
    simple.GL_RED_BITS                              : (1,),
    simple.GL_RED_SCALE                             : (1,),
    simple.GL_RENDER_MODE                           : (1,),
    simple.GL_RESCALE_NORMAL                        : (1,),
    simple.GL_RGBA_MODE                             : (1,),
    simple.GL_SAMPLE_BUFFERS                        : (1,),
    simple.GL_SAMPLE_COVERAGE_VALUE                 : (1,),
    simple.GL_SAMPLE_COVERAGE_INVERT                : (1,),
    simple.GL_SAMPLES                               : (1,),
    simple.GL_SCISSOR_BOX                           : (4,),
    simple.GL_SCISSOR_TEST                          : (1,),
    simple.GL_SECONDARY_COLOR_ARRAY                 : (1,),
    simple.GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING  : (1,),
    simple.GL_SECONDARY_COLOR_ARRAY_SIZE            : (1,),
    simple.GL_SECONDARY_COLOR_ARRAY_STRIDE          : (1,),
    simple.GL_SECONDARY_COLOR_ARRAY_TYPE            : (1,),
    simple.GL_SELECTION_BUFFER_SIZE                 : (1,),
    simple.GL_SEPARABLE_2D                          : (1,),
    simple.GL_SHADE_MODEL                           : (1,),
    simple.GL_SMOOTH_LINE_WIDTH_RANGE               : (2,),
    simple.GL_SMOOTH_LINE_WIDTH_GRANULARITY         : (1,),
    simple.GL_SMOOTH_POINT_SIZE_RANGE               : (2,),
    simple.GL_SMOOTH_POINT_SIZE_GRANULARITY         : (1,),
    simple.GL_STENCIL_BACK_FAIL                     : (1,),
    simple.GL_STENCIL_BACK_FUNC                     : (1,),
    simple.GL_STENCIL_BACK_PASS_DEPTH_FAIL          : (1,),
    simple.GL_STENCIL_BACK_PASS_DEPTH_PASS          : (1,),
    simple.GL_STENCIL_BACK_REF                      : (1,),
    simple.GL_STENCIL_BACK_VALUE_MASK               : (1,),
    simple.GL_STENCIL_BACK_WRITEMASK                : (1,),
    simple.GL_STENCIL_BITS                          : (1,),
    simple.GL_STENCIL_CLEAR_VALUE                   : (1,),
    simple.GL_STENCIL_FAIL                          : (1,),
    simple.GL_STENCIL_FUNC                          : (1,),
    simple.GL_STENCIL_PASS_DEPTH_FAIL               : (1,),
    simple.GL_STENCIL_PASS_DEPTH_PASS               : (1,),
    simple.GL_STENCIL_REF                           : (1,),
    simple.GL_STENCIL_TEST                          : (1,),
    simple.GL_STENCIL_VALUE_MASK                    : (1,),
    simple.GL_STENCIL_WRITEMASK                     : (1,),
    simple.GL_STEREO                                : (1,),
    simple.GL_SUBPIXEL_BITS                         : (1,),
    simple.GL_TEXTURE_1D                            : (1,),
    simple.GL_TEXTURE_2D                            : (1,),
    simple.GL_TEXTURE_3D                            : (1,),
    simple.GL_TEXTURE_CUBE_MAP                      : (1,),
    simple.GL_TEXTURE_BINDING_1D                    : (1,),
    simple.GL_TEXTURE_BINDING_2D                    : (1,),
    simple.GL_TEXTURE_BINDING_3D                    : (1,),
    simple.GL_TEXTURE_BINDING_CUBE_MAP              : (1,),
    simple.GL_TEXTURE_COMPRESSION_HINT              : (1,),
    simple.GL_TEXTURE_COORD_ARRAY                   : (1,),
    simple.GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING    : (1,),
    simple.GL_TEXTURE_COORD_ARRAY_SIZE              : (1,),
    simple.GL_TEXTURE_COORD_ARRAY_STRIDE            : (1,),
    simple.GL_TEXTURE_COORD_ARRAY_TYPE              : (1,),
    simple.GL_TEXTURE_GEN_Q                         : (1,),
    simple.GL_TEXTURE_GEN_R                         : (1,),
    simple.GL_TEXTURE_GEN_S                         : (1,),
    simple.GL_TEXTURE_GEN_T                         : (1,),
    simple.GL_TEXTURE_MATRIX                        : (4, 4),
    simple.GL_TEXTURE_STACK_DEPTH                   : (1,),
    simple.GL_TRANSPOSE_COLOR_MATRIX                : (4,4),
    simple.GL_TRANSPOSE_MODELVIEW_MATRIX            : (4,4),
    simple.GL_TRANSPOSE_PROJECTION_MATRIX           : (4,4),
    simple.GL_TRANSPOSE_TEXTURE_MATRIX              : (4,4),
    simple.GL_UNPACK_ALIGNMENT                      : (1,),
    simple.GL_UNPACK_IMAGE_HEIGHT                   : (1,),
    simple.GL_UNPACK_LSB_FIRST                      : (1,),
    simple.GL_UNPACK_ROW_LENGTH                     : (1,),
    simple.GL_UNPACK_SKIP_IMAGES                    : (1,),
    simple.GL_UNPACK_SKIP_PIXELS                    : (1,),
    simple.GL_UNPACK_SKIP_ROWS                      : (1,),
    simple.GL_UNPACK_SWAP_BYTES                     : (1,),
    simple.GL_VERTEX_ARRAY                          : (1,),
    simple.GL_VERTEX_ARRAY_BUFFER_BINDING           : (1,),
    simple.GL_VERTEX_ARRAY_SIZE                     : (1,),
    simple.GL_VERTEX_ARRAY_STRIDE                   : (1,),
    simple.GL_VERTEX_ARRAY_TYPE                     : (1,),
    simple.GL_VERTEX_PROGRAM_POINT_SIZE             : (1,),
    simple.GL_VERTEX_PROGRAM_TWO_SIDE               : (1,),
    simple.GL_VIEWPORT                              : (4,),
    simple.GL_ZOOM_X                                : (1,),
    simple.GL_ZOOM_Y                                : (1,),

    # Constants beyond OpenGL 2.1 (see src/find_glget_constants.py)...
    # Note: there are more, this is just what *my* hardware can find...
    simple.GL_ARRAY_ELEMENT_LOCK_COUNT_EXT: (1,),
    simple.GL_ARRAY_ELEMENT_LOCK_FIRST_EXT: (1,),
    simple.GL_BLEND_DST: (1,),
    simple.GL_BLEND_SRC: (1,),
    simple.GL_CLAMP_FRAGMENT_COLOR_ARB: (1,),
    simple.GL_CLAMP_READ_COLOR_ARB: (1,),
    simple.GL_CLAMP_VERTEX_COLOR_ARB: (1,),
    simple.GL_COLOR_ALPHA_PAIRING_ATI: (1,),
    simple.GL_COLOR_ARRAY_COUNT_EXT: (1,),
    simple.GL_COMPRESSED_TEXTURE_FORMATS: (1,),
    simple.GL_COMPRESSED_TEXTURE_FORMATS_ARB: (1,),
    simple.GL_CURRENT_FOG_COORDINATE: (1,),
    simple.GL_CURRENT_FOG_COORDINATE: (1,),
    simple.GL_CURRENT_FOG_COORDINATE_EXT: (1,),
    simple.GL_CURRENT_MATRIX_ARB: (4, 4),
    simple.GL_CURRENT_MATRIX_NV: (4, 4),
    simple.GL_CURRENT_MATRIX_STACK_DEPTH_ARB: (1,),
    simple.GL_CURRENT_MATRIX_STACK_DEPTH_NV: (1,),
    simple.GL_CURRENT_PROGRAM: (1,),
    simple.GL_DRAW_BUFFER0: (1,),
    simple.GL_DRAW_BUFFER0_ARB: (1,),
    simple.GL_DRAW_BUFFER0_ATI: (1,),
    simple.GL_DRAW_BUFFER1: (1,),
    simple.GL_DRAW_BUFFER10: (1,),
    simple.GL_DRAW_BUFFER10_ARB: (1,),
    simple.GL_DRAW_BUFFER10_ATI: (1,),
    simple.GL_DRAW_BUFFER11: (1,),
    simple.GL_DRAW_BUFFER11_ARB: (1,),
    simple.GL_DRAW_BUFFER11_ATI: (1,),
    simple.GL_DRAW_BUFFER12: (1,),
    simple.GL_DRAW_BUFFER12_ARB: (1,),
    simple.GL_DRAW_BUFFER12_ATI: (1,),
    simple.GL_DRAW_BUFFER13: (1,),
    simple.GL_DRAW_BUFFER13_ARB: (1,),
    simple.GL_DRAW_BUFFER13_ATI: (1,),
    simple.GL_DRAW_BUFFER14: (1,),
    simple.GL_DRAW_BUFFER14_ARB: (1,),
    simple.GL_DRAW_BUFFER14_ATI: (1,),
    simple.GL_DRAW_BUFFER15: (1,),
    simple.GL_DRAW_BUFFER15_ARB: (1,),
    simple.GL_DRAW_BUFFER15_ATI: (1,),
    simple.GL_DRAW_BUFFER1_ARB: (1,),
    simple.GL_DRAW_BUFFER1_ATI: (1,),
    simple.GL_DRAW_BUFFER2: (1,),
    simple.GL_DRAW_BUFFER2_ARB: (1,),
    simple.GL_DRAW_BUFFER2_ATI: (1,),
    simple.GL_DRAW_BUFFER3: (1,),
    simple.GL_DRAW_BUFFER3_ARB: (1,),
    simple.GL_DRAW_BUFFER3_ATI: (1,),
    simple.GL_DRAW_BUFFER4: (1,),
    simple.GL_DRAW_BUFFER4_ARB: (1,),
    simple.GL_DRAW_BUFFER4_ATI: (1,),
    simple.GL_DRAW_BUFFER5: (1,),
    simple.GL_DRAW_BUFFER5_ARB: (1,),
    simple.GL_DRAW_BUFFER5_ATI: (1,),
    simple.GL_DRAW_BUFFER6: (1,),
    simple.GL_DRAW_BUFFER6_ARB: (1,),
    simple.GL_DRAW_BUFFER6_ATI: (1,),
    simple.GL_DRAW_BUFFER7: (1,),
    simple.GL_DRAW_BUFFER7_ARB: (1,),
    simple.GL_DRAW_BUFFER7_ATI: (1,),
    simple.GL_DRAW_BUFFER8: (1,),
    simple.GL_DRAW_BUFFER8_ARB: (1,),
    simple.GL_DRAW_BUFFER8_ATI: (1,),
    simple.GL_DRAW_BUFFER9: (1,),
    simple.GL_DRAW_BUFFER9_ARB: (1,),
    simple.GL_DRAW_BUFFER9_ATI: (1,),
    simple.GL_EDGE_FLAG_ARRAY_COUNT_EXT: (1,),
    simple.GL_FRAGMENT_PROGRAM_ARB: (1,),
    simple.GL_FRAGMENT_SHADER_ATI: (1,),
    simple.GL_FRAMEBUFFER_BINDING_EXT: (1,),
    simple.GL_INDEX_ARRAY_COUNT_EXT: (1,),
    simple.GL_MAX_COLOR_ATTACHMENTS_EXT: (1,),
    simple.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: (1,),
    simple.GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB: (1,),
    simple.GL_MAX_PROGRAM_MATRICES_ARB: (1,),
    simple.GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB: (1,),
    simple.GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB: (1,),
    simple.GL_MAX_RECTANGLE_TEXTURE_SIZE_NV: (1,),
    simple.GL_MAX_RENDERBUFFER_SIZE_EXT: (1,),
    simple.GL_MAX_TEXTURE_COORDS: (1,),
    simple.GL_MAX_TEXTURE_COORDS_ARB: (1,),
    simple.GL_MAX_TEXTURE_COORDS_NV: (1,),
    simple.GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT: (1,),
    simple.GL_MAX_TRACK_MATRICES_NV: (1,),
    simple.GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV: (1,),
    simple.GL_MULTISAMPLE: (1,),
    simple.GL_MULTISAMPLE_ARB: (1,),
    simple.GL_MULTISAMPLE_EXT: (1,),
    simple.GL_MULTISAMPLE_SGIS: (1,),
    simple.GL_NORMAL_ARRAY_COUNT_EXT: (1,),
    simple.GL_NUM_FRAGMENT_CONSTANTS_ATI: (1,),
    simple.GL_NUM_FRAGMENT_REGISTERS_ATI: (1,),
    simple.GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI: (1,),
    simple.GL_NUM_INSTRUCTIONS_PER_PASS_ATI: (1,),
    simple.GL_NUM_INSTRUCTIONS_TOTAL_ATI: (1,),
    simple.GL_NUM_LOOPBACK_COMPONENTS_ATI: (1,),
    simple.GL_NUM_PASSES_ATI: (1,),
    simple.GL_PIXEL_COUNTER_BITS_NV: (1,),
    simple.GL_POINT_SPRITE: (1,),
    simple.GL_POINT_SPRITE_ARB: (1,),
    simple.GL_POINT_SPRITE_COORD_ORIGIN: (1,),
    simple.GL_POINT_SPRITE_NV: (1,),
    simple.GL_PRIMITIVE_RESTART_INDEX_NV: (1,),
    simple.GL_PRIMITIVE_RESTART_NV: (1,),
    simple.GL_PROGRAM_ERROR_POSITION_ARB: (1,),
    simple.GL_PROGRAM_ERROR_POSITION_NV: (1,),
    simple.GL_QUERY_COUNTER_BITS: (1,),
    simple.GL_QUERY_COUNTER_BITS_ARB: (1,),
    simple.GL_RENDERBUFFER_BINDING_EXT: (1,),
    simple.GL_RGBA_FLOAT_MODE_ARB: (1,),
    simple.GL_SAMPLE_ALPHA_TO_COVERAGE: (1,),
    simple.GL_SAMPLE_ALPHA_TO_COVERAGE_ARB: (1,),
    simple.GL_SAMPLE_ALPHA_TO_MASK_EXT: (1,),
    simple.GL_SAMPLE_ALPHA_TO_MASK_SGIS: (1,),
    simple.GL_SAMPLE_ALPHA_TO_ONE: (1,),
    simple.GL_SAMPLE_ALPHA_TO_ONE_ARB: (1,),
    simple.GL_SAMPLE_ALPHA_TO_ONE_EXT: (1,),
    simple.GL_SAMPLE_ALPHA_TO_ONE_SGIS: (1,),
    simple.GL_SAMPLE_COVERAGE: (1,),
    simple.GL_SAMPLE_COVERAGE_ARB: (1,),
    simple.GL_SAMPLE_MASK_EXT: (1,),
    simple.GL_SAMPLE_MASK_SGIS: (1,),
    simple.GL_TEXTURE_BINDING_RECTANGLE_ARB: (1,),
    simple.GL_TEXTURE_BINDING_RECTANGLE_NV: (1,),
    simple.GL_TEXTURE_COORD_ARRAY_COUNT_EXT: (1,),
    simple.GL_TEXTURE_RECTANGLE_ARB: (1,),
    simple.GL_TEXTURE_RECTANGLE_NV: (1,),
    simple.GL_TRANSPOSE_CURRENT_MATRIX_ARB: (4, 4),
    simple.GL_TYPE_RGBA_FLOAT_ATI: (1,),
    simple.GL_UNPACK_CLIENT_STORAGE_APPLE: (1,),
    simple.GL_VERTEX_ARRAY_BINDING_APPLE: (1,),
    simple.GL_VERTEX_ARRAY_COUNT_EXT: (1,),
    simple.GL_VERTEX_PROGRAM_ARB: (1,),
    simple.GL_VERTEX_PROGRAM_NV: (1,),
    simple.GL_VERTEX_SHADER_EXT: (1,),
}
def addGLGetConstant( constant, arraySize ):
    """Add a glGet* constant to return an output array of correct size"""
    GL_GET_SIZES[ constant ] = arraySize
glGetDouble = glGetDoublev = wrapper.wrapper(simple.glGetDoublev).setOutput(
    "params",GL_GET_SIZES, "pname",
)
glGetFloat = glGetFloatv = wrapper.wrapper(simple.glGetFloatv).setOutput(
    "params",GL_GET_SIZES, "pname",
)
glGetBoolean = glGetBooleanv = glGetInteger = glGetIntegerv = wrapper.wrapper(simple.glGetIntegerv).setOutput(
    "params",GL_GET_SIZES, "pname",
)

GL_GET_LIGHT_SIZES = {
    # glGetLightXv
    simple.GL_AMBIENT                               : (4,),
    simple.GL_DIFFUSE                               : (4,),
    simple.GL_SPECULAR                              : (4,),
    simple.GL_POSITION                              : (4,),
    simple.GL_SPOT_DIRECTION                        : (3,),
    simple.GL_SPOT_EXPONENT                         : (1,),
    simple.GL_SPOT_CUTOFF                           : (1,),
    simple.GL_CONSTANT_ATTENUATION                  : (1,),
    simple.GL_LINEAR_ATTENUATION                    : (1,),
    simple.GL_QUADRATIC_ATTENUATION                 : (1,),
} # end of sizes
glGetLightfv = wrapper.wrapper(simple.glGetLightfv).setOutput(
    "params",GL_GET_LIGHT_SIZES, "pname",
)
glGetLightiv = wrapper.wrapper(simple.glGetLightiv).setOutput(
    "params",GL_GET_LIGHT_SIZES, "pname",
)

GL_GET_MATERIAL_SIZES = {
    simple.GL_AMBIENT: (4,),
    simple.GL_DIFFUSE: (4,),
    simple.GL_SPECULAR: (4,),
    simple.GL_EMISSION: (4,),
    simple.GL_SHININESS: (1,),
    simple.GL_COLOR_INDEXES: (3,)
}
glGetMaterialfv = wrapper.wrapper(simple.glGetMaterialfv).setOutput(
    "params",GL_GET_MATERIAL_SIZES, "pname",
)
glGetMaterialiv = wrapper.wrapper(simple.glGetMaterialiv).setOutput(
    "params",GL_GET_MATERIAL_SIZES, "pname",
)
PIXEL_MAP_SIZE_CONSTANT_MAP = {
    simple.GL_PIXEL_MAP_A_TO_A: simple.GL_PIXEL_MAP_A_TO_A_SIZE,
    simple.GL_PIXEL_MAP_B_TO_B: simple.GL_PIXEL_MAP_B_TO_B_SIZE,
    simple.GL_PIXEL_MAP_G_TO_G: simple.GL_PIXEL_MAP_G_TO_G_SIZE,
    simple.GL_PIXEL_MAP_I_TO_A: simple.GL_PIXEL_MAP_I_TO_A_SIZE,
    simple.GL_PIXEL_MAP_I_TO_B: simple.GL_PIXEL_MAP_I_TO_B_SIZE,
    simple.GL_PIXEL_MAP_I_TO_G: simple.GL_PIXEL_MAP_I_TO_G_SIZE,
    simple.GL_PIXEL_MAP_I_TO_I: simple.GL_PIXEL_MAP_I_TO_I_SIZE,
    simple.GL_PIXEL_MAP_I_TO_R: simple.GL_PIXEL_MAP_I_TO_R_SIZE,
    simple.GL_PIXEL_MAP_R_TO_R: simple.GL_PIXEL_MAP_R_TO_R_SIZE,
    simple.GL_PIXEL_MAP_S_TO_S: simple.GL_PIXEL_MAP_S_TO_S_SIZE,
}
def GL_GET_PIXEL_MAP_SIZE( pname ):
    """Given a pname, lookup the size using a glGet query..."""
    constant = PIXEL_MAP_SIZE_CONSTANT_MAP[ pname ]
    return glGetIntegerv( constant )
glGetPixelMapfv = wrapper.wrapper(simple.glGetPixelMapfv).setOutput(
    "values",GL_GET_PIXEL_MAP_SIZE, "map",
)
glGetPixelMapuiv = wrapper.wrapper(simple.glGetPixelMapuiv).setOutput(
    "values",GL_GET_PIXEL_MAP_SIZE, "map",
)
glGetPixelMapusv = wrapper.wrapper(simple.glGetPixelMapusv).setOutput(
    "values",GL_GET_PIXEL_MAP_SIZE, "map",
)

# 32 * 32 bits
POLYGON_STIPPLE_SIZE = (32*32//8,)
glGetPolygonStipple = glGetPolygonStippleub = wrapper.wrapper(simple.glGetPolygonStipple).setOutput(
    "mask",POLYGON_STIPPLE_SIZE,
)
GL_GET_TEX_ENV_SIZES = {
    simple.GL_TEXTURE_ENV_MODE: (1,),
    simple.GL_TEXTURE_ENV_COLOR: (4,),
}
glGetTexEnvfv = wrapper.wrapper(simple.glGetTexEnvfv).setOutput(
    "params",GL_GET_TEX_ENV_SIZES, 'pname',
)
glGetTexEnviv = wrapper.wrapper(simple.glGetTexEnviv).setOutput(
    "params",GL_GET_TEX_ENV_SIZES, 'pname',
)
GL_GET_TEX_GEN_SIZES = {
    simple.GL_TEXTURE_GEN_MODE: (1,),
    simple.GL_OBJECT_PLANE: (4,),
    simple.GL_EYE_PLANE: (4,),
}
glGetTexGendv = wrapper.wrapper(simple.glGetTexGendv).setOutput(
    "params",GL_GET_TEX_GEN_SIZES, 'pname',
)
glGetTexGenfv = wrapper.wrapper(simple.glGetTexGenfv).setOutput(
    "params",GL_GET_TEX_GEN_SIZES, 'pname',
)
glGetTexGeniv = wrapper.wrapper(simple.glGetTexGeniv).setOutput(
    "params",GL_GET_TEX_GEN_SIZES, 'pname',
)

glGetTexLevelParameterfv = wrapper.wrapper(simple.glGetTexLevelParameterfv).setOutput(
    "params",(1,)
)
glGetTexLevelParameteriv = wrapper.wrapper(simple.glGetTexLevelParameteriv).setOutput(
    "params",(1,)
)
TEX_PARAMETER_SIZES = {
    simple.GL_TEXTURE_MAG_FILTER: (1,),
    simple.GL_TEXTURE_MIN_FILTER: (1,),
    simple.GL_TEXTURE_MIN_LOD: (1,),
    simple.GL_TEXTURE_MAX_LOD: (1,),
    simple.GL_TEXTURE_BASE_LEVEL: (1,),
    simple.GL_TEXTURE_MAX_LEVEL: (1,),
    simple.GL_TEXTURE_WRAP_S: (1,),
    simple.GL_TEXTURE_WRAP_T: (1,),
    simple.GL_TEXTURE_WRAP_R: (1,),
    simple.GL_TEXTURE_BORDER_COLOR: (4,),
    simple.GL_TEXTURE_PRIORITY: (1,),
    simple.GL_TEXTURE_RESIDENT: (1,)
}

glGetTexParameterfv = wrapper.wrapper(simple.glGetTexParameterfv).setOutput(
    "params",TEX_PARAMETER_SIZES, 'pname',
)
glGetTexParameteriv = wrapper.wrapper(simple.glGetTexParameteriv).setOutput(
    "params",TEX_PARAMETER_SIZES, 'pname',
)
