From 5f3c451631013c096bf37a2fe4ae81669586f5d0 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Sun, 3 Apr 2022 23:09:04 +0300 Subject: [PATCH] update code --- .editorconfig | 14 + .gitignore | 5 + LICENSE | 24 + Makefile | 6 +- README.md | 17 +- glfw3.dll | Bin 196839 -> 0 bytes requirements-dev.txt | 1 + .../fps_counter/fps_counter.c | 4 +- src/fps_counter/fps_counter.png | Bin 0 -> 4418 bytes {rotate_cube => src/rotate_cube}/README.md | 11 +- .../rotate_cube}/rotate_cube.c | 6 +- .../rotate_cube}/rotate_cube.png | Bin {win32 => src/windows_icon}/icon/resource.rc | 0 {win32 => src/windows_icon}/icon/windows.ico | Bin .../windows_icon/windows_icon.c | 0 win32/include/GL/GL.H | 1526 -------- win32/include/GLFW/glfw3.h | 3340 ----------------- win32/include/GLFW/glfw3native.h | 356 -- win32/lib/OPENGL32.LIB | Bin 77112 -> 0 bytes win32/lib/glfw3.def | 86 - win32/lib/glfw3dll.a | Bin 54834 -> 0 bytes win32/lib/libglfw3.a | Bin 89732 -> 0 bytes 22 files changed, 70 insertions(+), 5326 deletions(-) create mode 100644 .editorconfig create mode 100644 LICENSE delete mode 100644 glfw3.dll create mode 100644 requirements-dev.txt rename fps_counter.c => src/fps_counter/fps_counter.c (93%) create mode 100644 src/fps_counter/fps_counter.png rename {rotate_cube => src/rotate_cube}/README.md (52%) rename {rotate_cube => src/rotate_cube}/rotate_cube.c (97%) rename {rotate_cube => src/rotate_cube}/rotate_cube.png (100%) rename {win32 => src/windows_icon}/icon/resource.rc (100%) rename {win32 => src/windows_icon}/icon/windows.ico (100%) rename windows_icon.c => src/windows_icon/windows_icon.c (100%) delete mode 100644 win32/include/GL/GL.H delete mode 100644 win32/include/GLFW/glfw3.h delete mode 100644 win32/include/GLFW/glfw3native.h delete mode 100644 win32/lib/OPENGL32.LIB delete mode 100644 win32/lib/glfw3.def delete mode 100644 win32/lib/glfw3dll.a delete mode 100644 win32/lib/libglfw3.a diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7e528b9 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +# C +[{*.c,*.h}] +indent_style = space +indent_size = 2 diff --git a/.gitignore b/.gitignore index b883f1f..4104693 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ +# windows binary *.exe + +# unix binary +fps_counter +rotate_cube diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/Makefile b/Makefile index 35c2f7d..955b115 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -CC=gcc +CC=tcc all: fps_counter rotate_cube fps_counter: - $(CC) fps_counter.c -lglfw -lGL -o fps_counter + $(CC) src/fps_counter/fps_counter.c -lglfw -lGL -o fps_counter rotate_cube: - $(CC) rotate_cube.c -lglfw -lGL -o rotate_cube.exe + $(CC) src/rotate_cube/rotate_cube.c -lglfw -lGL -o rotate_cube diff --git a/README.md b/README.md index 09ed6c3..48bf42c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ GLFW Examples ------------- **Что это?** -В этом репозитории собраны примеры использования [GLFW](http://www.glfw.org/), кроссплатформенной библиотеки для создания окна с OpenGL контекстом и управления вводом. +В этом репозитории собраны примеры использования [GLFW](http://www.glfw.org/), +кроссплатформенной библиотеки для создания окна с OpenGL контекстом и управления вводом. **На каком языке программирования написаны примеры?** Примеры написаны на чистом Си (C99). @@ -12,10 +13,10 @@ GLFW Examples Примеры ------- ### Вращающийся куб -![Rotate Cube](https://raw.githubusercontent.com/IIIypuk/glfw-examples/master/rotate_cube/rotate_cube.png) -**Управление:** -`Up` - повернуть куб вверх -`Left` - повернуть куб влево -`Right` - повернуть куб вправо -`Down` - повернуть куб вверх -`Esc` - Закрыть окно +[[Ссылка](rotate_cube/)] +![Preview](rotate_cube/rotate_cube.png) + +### Счётчик FPS в заголовке окна +[[Ссылка](fps_counter/)] +![Preview](fps_counter/fps_counter.png) + diff --git a/glfw3.dll b/glfw3.dll deleted file mode 100644 index 84c2e1bc2d0dead970c3f40c635e42b6f3b8a81a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196839 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

De7clu_r3z3f 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 -#include "GLFW/glfw3.h" +#include int main() { diff --git a/src/fps_counter/fps_counter.png b/src/fps_counter/fps_counter.png new file mode 100644 index 0000000000000000000000000000000000000000..700d09b8e05216fc3cef11419ae5ee3c8bee79bc GIT binary patch literal 4418 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 -#ifndef __WIN32 +#if defined _WIN32 #include #endif #include @@ -15,7 +15,7 @@ void keyboard_callback(GLFWwindow *window, int key, int scancode, int rotate_y = 0; int rotate_x = 0; -#ifndef __WIN32 +#if defined _WIN32 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nShowCmd) #else diff --git a/rotate_cube/rotate_cube.png b/src/rotate_cube/rotate_cube.png similarity index 100% rename from rotate_cube/rotate_cube.png rename to src/rotate_cube/rotate_cube.png diff --git a/win32/icon/resource.rc b/src/windows_icon/icon/resource.rc similarity index 100% rename from win32/icon/resource.rc rename to src/windows_icon/icon/resource.rc diff --git a/win32/icon/windows.ico b/src/windows_icon/icon/windows.ico similarity index 100% rename from win32/icon/windows.ico rename to src/windows_icon/icon/windows.ico diff --git a/windows_icon.c b/src/windows_icon/windows_icon.c similarity index 100% rename from windows_icon.c rename to src/windows_icon/windows_icon.c diff --git a/win32/include/GL/GL.H b/win32/include/GL/GL.H deleted file mode 100644 index ceeaabe..0000000 --- a/win32/include/GL/GL.H +++ /dev/null @@ -1,1526 +0,0 @@ -/*++ BUILD Version: 0004 // Increment this if a change has global effects - -Copyright (c) 1985-96, Microsoft Corporation - -Module Name: - - gl.h - -Abstract: - - Procedure declarations, constant definitions and macros for the OpenGL - component. - ---*/ - -#ifndef __gl_h_ -#ifndef __GL_H__ - -#define __gl_h_ -#define __GL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* -** Copyright 1996 Silicon Graphics, Inc. -** All Rights Reserved. -** -** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; -** the contents of this file may not be disclosed to third parties, copied or -** duplicated in any form, in whole or in part, without the prior written -** permission of Silicon Graphics, Inc. -** -** RESTRICTED RIGHTS LEGEND: -** Use, duplication or disclosure by the Government is subject to restrictions -** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data -** and Computer Software clause at DFARS 252.227-7013, and/or in similar or -** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - -** rights reserved under the Copyright Laws of the United States. -*/ - -typedef unsigned int GLenum; -typedef unsigned char GLboolean; -typedef unsigned int GLbitfield; -typedef signed char GLbyte; -typedef short GLshort; -typedef int GLint; -typedef int GLsizei; -typedef unsigned char GLubyte; -typedef unsigned short GLushort; -typedef unsigned int GLuint; -typedef float GLfloat; -typedef float GLclampf; -typedef double GLdouble; -typedef double GLclampd; -typedef void GLvoid; - -/*************************************************************/ - -/* Version */ -#define GL_VERSION_1_1 1 - -/* AccumOp */ -#define GL_ACCUM 0x0100 -#define GL_LOAD 0x0101 -#define GL_RETURN 0x0102 -#define GL_MULT 0x0103 -#define GL_ADD 0x0104 - -/* AlphaFunction */ -#define GL_NEVER 0x0200 -#define GL_LESS 0x0201 -#define GL_EQUAL 0x0202 -#define GL_LEQUAL 0x0203 -#define GL_GREATER 0x0204 -#define GL_NOTEQUAL 0x0205 -#define GL_GEQUAL 0x0206 -#define GL_ALWAYS 0x0207 - -/* AttribMask */ -#define GL_CURRENT_BIT 0x00000001 -#define GL_POINT_BIT 0x00000002 -#define GL_LINE_BIT 0x00000004 -#define GL_POLYGON_BIT 0x00000008 -#define GL_POLYGON_STIPPLE_BIT 0x00000010 -#define GL_PIXEL_MODE_BIT 0x00000020 -#define GL_LIGHTING_BIT 0x00000040 -#define GL_FOG_BIT 0x00000080 -#define GL_DEPTH_BUFFER_BIT 0x00000100 -#define GL_ACCUM_BUFFER_BIT 0x00000200 -#define GL_STENCIL_BUFFER_BIT 0x00000400 -#define GL_VIEWPORT_BIT 0x00000800 -#define GL_TRANSFORM_BIT 0x00001000 -#define GL_ENABLE_BIT 0x00002000 -#define GL_COLOR_BUFFER_BIT 0x00004000 -#define GL_HINT_BIT 0x00008000 -#define GL_EVAL_BIT 0x00010000 -#define GL_LIST_BIT 0x00020000 -#define GL_TEXTURE_BIT 0x00040000 -#define GL_SCISSOR_BIT 0x00080000 -#define GL_ALL_ATTRIB_BITS 0x000fffff - -/* BeginMode */ -#define GL_POINTS 0x0000 -#define GL_LINES 0x0001 -#define GL_LINE_LOOP 0x0002 -#define GL_LINE_STRIP 0x0003 -#define GL_TRIANGLES 0x0004 -#define GL_TRIANGLE_STRIP 0x0005 -#define GL_TRIANGLE_FAN 0x0006 -#define GL_QUADS 0x0007 -#define GL_QUAD_STRIP 0x0008 -#define GL_POLYGON 0x0009 - -/* BlendingFactorDest */ -#define GL_ZERO 0 -#define GL_ONE 1 -#define GL_SRC_COLOR 0x0300 -#define GL_ONE_MINUS_SRC_COLOR 0x0301 -#define GL_SRC_ALPHA 0x0302 -#define GL_ONE_MINUS_SRC_ALPHA 0x0303 -#define GL_DST_ALPHA 0x0304 -#define GL_ONE_MINUS_DST_ALPHA 0x0305 - -/* BlendingFactorSrc */ -/* GL_ZERO */ -/* GL_ONE */ -#define GL_DST_COLOR 0x0306 -#define GL_ONE_MINUS_DST_COLOR 0x0307 -#define GL_SRC_ALPHA_SATURATE 0x0308 -/* GL_SRC_ALPHA */ -/* GL_ONE_MINUS_SRC_ALPHA */ -/* GL_DST_ALPHA */ -/* GL_ONE_MINUS_DST_ALPHA */ - -/* Boolean */ -#define GL_TRUE 1 -#define GL_FALSE 0 - -/* ClearBufferMask */ -/* GL_COLOR_BUFFER_BIT */ -/* GL_ACCUM_BUFFER_BIT */ -/* GL_STENCIL_BUFFER_BIT */ -/* GL_DEPTH_BUFFER_BIT */ - -/* ClientArrayType */ -/* GL_VERTEX_ARRAY */ -/* GL_NORMAL_ARRAY */ -/* GL_COLOR_ARRAY */ -/* GL_INDEX_ARRAY */ -/* GL_TEXTURE_COORD_ARRAY */ -/* GL_EDGE_FLAG_ARRAY */ - -/* ClipPlaneName */ -#define GL_CLIP_PLANE0 0x3000 -#define GL_CLIP_PLANE1 0x3001 -#define GL_CLIP_PLANE2 0x3002 -#define GL_CLIP_PLANE3 0x3003 -#define GL_CLIP_PLANE4 0x3004 -#define GL_CLIP_PLANE5 0x3005 - -/* ColorMaterialFace */ -/* GL_FRONT */ -/* GL_BACK */ -/* GL_FRONT_AND_BACK */ - -/* ColorMaterialParameter */ -/* GL_AMBIENT */ -/* GL_DIFFUSE */ -/* GL_SPECULAR */ -/* GL_EMISSION */ -/* GL_AMBIENT_AND_DIFFUSE */ - -/* ColorPointerType */ -/* GL_BYTE */ -/* GL_UNSIGNED_BYTE */ -/* GL_SHORT */ -/* GL_UNSIGNED_SHORT */ -/* GL_INT */ -/* GL_UNSIGNED_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* CullFaceMode */ -/* GL_FRONT */ -/* GL_BACK */ -/* GL_FRONT_AND_BACK */ - -/* DataType */ -#define GL_BYTE 0x1400 -#define GL_UNSIGNED_BYTE 0x1401 -#define GL_SHORT 0x1402 -#define GL_UNSIGNED_SHORT 0x1403 -#define GL_INT 0x1404 -#define GL_UNSIGNED_INT 0x1405 -#define GL_FLOAT 0x1406 -#define GL_2_BYTES 0x1407 -#define GL_3_BYTES 0x1408 -#define GL_4_BYTES 0x1409 -#define GL_DOUBLE 0x140A - -/* DepthFunction */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* DrawBufferMode */ -#define GL_NONE 0 -#define GL_FRONT_LEFT 0x0400 -#define GL_FRONT_RIGHT 0x0401 -#define GL_BACK_LEFT 0x0402 -#define GL_BACK_RIGHT 0x0403 -#define GL_FRONT 0x0404 -#define GL_BACK 0x0405 -#define GL_LEFT 0x0406 -#define GL_RIGHT 0x0407 -#define GL_FRONT_AND_BACK 0x0408 -#define GL_AUX0 0x0409 -#define GL_AUX1 0x040A -#define GL_AUX2 0x040B -#define GL_AUX3 0x040C - -/* Enable */ -/* GL_FOG */ -/* GL_LIGHTING */ -/* GL_TEXTURE_1D */ -/* GL_TEXTURE_2D */ -/* GL_LINE_STIPPLE */ -/* GL_POLYGON_STIPPLE */ -/* GL_CULL_FACE */ -/* GL_ALPHA_TEST */ -/* GL_BLEND */ -/* GL_INDEX_LOGIC_OP */ -/* GL_COLOR_LOGIC_OP */ -/* GL_DITHER */ -/* GL_STENCIL_TEST */ -/* GL_DEPTH_TEST */ -/* GL_CLIP_PLANE0 */ -/* GL_CLIP_PLANE1 */ -/* GL_CLIP_PLANE2 */ -/* GL_CLIP_PLANE3 */ -/* GL_CLIP_PLANE4 */ -/* GL_CLIP_PLANE5 */ -/* GL_LIGHT0 */ -/* GL_LIGHT1 */ -/* GL_LIGHT2 */ -/* GL_LIGHT3 */ -/* GL_LIGHT4 */ -/* GL_LIGHT5 */ -/* GL_LIGHT6 */ -/* GL_LIGHT7 */ -/* GL_TEXTURE_GEN_S */ -/* GL_TEXTURE_GEN_T */ -/* GL_TEXTURE_GEN_R */ -/* GL_TEXTURE_GEN_Q */ -/* GL_MAP1_VERTEX_3 */ -/* GL_MAP1_VERTEX_4 */ -/* GL_MAP1_COLOR_4 */ -/* GL_MAP1_INDEX */ -/* GL_MAP1_NORMAL */ -/* GL_MAP1_TEXTURE_COORD_1 */ -/* GL_MAP1_TEXTURE_COORD_2 */ -/* GL_MAP1_TEXTURE_COORD_3 */ -/* GL_MAP1_TEXTURE_COORD_4 */ -/* GL_MAP2_VERTEX_3 */ -/* GL_MAP2_VERTEX_4 */ -/* GL_MAP2_COLOR_4 */ -/* GL_MAP2_INDEX */ -/* GL_MAP2_NORMAL */ -/* GL_MAP2_TEXTURE_COORD_1 */ -/* GL_MAP2_TEXTURE_COORD_2 */ -/* GL_MAP2_TEXTURE_COORD_3 */ -/* GL_MAP2_TEXTURE_COORD_4 */ -/* GL_POINT_SMOOTH */ -/* GL_LINE_SMOOTH */ -/* GL_POLYGON_SMOOTH */ -/* GL_SCISSOR_TEST */ -/* GL_COLOR_MATERIAL */ -/* GL_NORMALIZE */ -/* GL_AUTO_NORMAL */ -/* GL_VERTEX_ARRAY */ -/* GL_NORMAL_ARRAY */ -/* GL_COLOR_ARRAY */ -/* GL_INDEX_ARRAY */ -/* GL_TEXTURE_COORD_ARRAY */ -/* GL_EDGE_FLAG_ARRAY */ -/* GL_POLYGON_OFFSET_POINT */ -/* GL_POLYGON_OFFSET_LINE */ -/* GL_POLYGON_OFFSET_FILL */ - -/* ErrorCode */ -#define GL_NO_ERROR 0 -#define GL_INVALID_ENUM 0x0500 -#define GL_INVALID_VALUE 0x0501 -#define GL_INVALID_OPERATION 0x0502 -#define GL_STACK_OVERFLOW 0x0503 -#define GL_STACK_UNDERFLOW 0x0504 -#define GL_OUT_OF_MEMORY 0x0505 - -/* FeedBackMode */ -#define GL_2D 0x0600 -#define GL_3D 0x0601 -#define GL_3D_COLOR 0x0602 -#define GL_3D_COLOR_TEXTURE 0x0603 -#define GL_4D_COLOR_TEXTURE 0x0604 - -/* FeedBackToken */ -#define GL_PASS_THROUGH_TOKEN 0x0700 -#define GL_POINT_TOKEN 0x0701 -#define GL_LINE_TOKEN 0x0702 -#define GL_POLYGON_TOKEN 0x0703 -#define GL_BITMAP_TOKEN 0x0704 -#define GL_DRAW_PIXEL_TOKEN 0x0705 -#define GL_COPY_PIXEL_TOKEN 0x0706 -#define GL_LINE_RESET_TOKEN 0x0707 - -/* FogMode */ -/* GL_LINEAR */ -#define GL_EXP 0x0800 -#define GL_EXP2 0x0801 - - -/* FogParameter */ -/* GL_FOG_COLOR */ -/* GL_FOG_DENSITY */ -/* GL_FOG_END */ -/* GL_FOG_INDEX */ -/* GL_FOG_MODE */ -/* GL_FOG_START */ - -/* FrontFaceDirection */ -#define GL_CW 0x0900 -#define GL_CCW 0x0901 - -/* GetMapTarget */ -#define GL_COEFF 0x0A00 -#define GL_ORDER 0x0A01 -#define GL_DOMAIN 0x0A02 - -/* GetPixelMap */ -/* GL_PIXEL_MAP_I_TO_I */ -/* GL_PIXEL_MAP_S_TO_S */ -/* GL_PIXEL_MAP_I_TO_R */ -/* GL_PIXEL_MAP_I_TO_G */ -/* GL_PIXEL_MAP_I_TO_B */ -/* GL_PIXEL_MAP_I_TO_A */ -/* GL_PIXEL_MAP_R_TO_R */ -/* GL_PIXEL_MAP_G_TO_G */ -/* GL_PIXEL_MAP_B_TO_B */ -/* GL_PIXEL_MAP_A_TO_A */ - -/* GetPointerTarget */ -/* GL_VERTEX_ARRAY_POINTER */ -/* GL_NORMAL_ARRAY_POINTER */ -/* GL_COLOR_ARRAY_POINTER */ -/* GL_INDEX_ARRAY_POINTER */ -/* GL_TEXTURE_COORD_ARRAY_POINTER */ -/* GL_EDGE_FLAG_ARRAY_POINTER */ - -/* GetTarget */ -#define GL_CURRENT_COLOR 0x0B00 -#define GL_CURRENT_INDEX 0x0B01 -#define GL_CURRENT_NORMAL 0x0B02 -#define GL_CURRENT_TEXTURE_COORDS 0x0B03 -#define GL_CURRENT_RASTER_COLOR 0x0B04 -#define GL_CURRENT_RASTER_INDEX 0x0B05 -#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 -#define GL_CURRENT_RASTER_POSITION 0x0B07 -#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 -#define GL_CURRENT_RASTER_DISTANCE 0x0B09 -#define GL_POINT_SMOOTH 0x0B10 -#define GL_POINT_SIZE 0x0B11 -#define GL_POINT_SIZE_RANGE 0x0B12 -#define GL_POINT_SIZE_GRANULARITY 0x0B13 -#define GL_LINE_SMOOTH 0x0B20 -#define GL_LINE_WIDTH 0x0B21 -#define GL_LINE_WIDTH_RANGE 0x0B22 -#define GL_LINE_WIDTH_GRANULARITY 0x0B23 -#define GL_LINE_STIPPLE 0x0B24 -#define GL_LINE_STIPPLE_PATTERN 0x0B25 -#define GL_LINE_STIPPLE_REPEAT 0x0B26 -#define GL_LIST_MODE 0x0B30 -#define GL_MAX_LIST_NESTING 0x0B31 -#define GL_LIST_BASE 0x0B32 -#define GL_LIST_INDEX 0x0B33 -#define GL_POLYGON_MODE 0x0B40 -#define GL_POLYGON_SMOOTH 0x0B41 -#define GL_POLYGON_STIPPLE 0x0B42 -#define GL_EDGE_FLAG 0x0B43 -#define GL_CULL_FACE 0x0B44 -#define GL_CULL_FACE_MODE 0x0B45 -#define GL_FRONT_FACE 0x0B46 -#define GL_LIGHTING 0x0B50 -#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 -#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 -#define GL_LIGHT_MODEL_AMBIENT 0x0B53 -#define GL_SHADE_MODEL 0x0B54 -#define GL_COLOR_MATERIAL_FACE 0x0B55 -#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 -#define GL_COLOR_MATERIAL 0x0B57 -#define GL_FOG 0x0B60 -#define GL_FOG_INDEX 0x0B61 -#define GL_FOG_DENSITY 0x0B62 -#define GL_FOG_START 0x0B63 -#define GL_FOG_END 0x0B64 -#define GL_FOG_MODE 0x0B65 -#define GL_FOG_COLOR 0x0B66 -#define GL_DEPTH_RANGE 0x0B70 -#define GL_DEPTH_TEST 0x0B71 -#define GL_DEPTH_WRITEMASK 0x0B72 -#define GL_DEPTH_CLEAR_VALUE 0x0B73 -#define GL_DEPTH_FUNC 0x0B74 -#define GL_ACCUM_CLEAR_VALUE 0x0B80 -#define GL_STENCIL_TEST 0x0B90 -#define GL_STENCIL_CLEAR_VALUE 0x0B91 -#define GL_STENCIL_FUNC 0x0B92 -#define GL_STENCIL_VALUE_MASK 0x0B93 -#define GL_STENCIL_FAIL 0x0B94 -#define GL_STENCIL_PASS_DEPTH_FAIL 0x0B95 -#define GL_STENCIL_PASS_DEPTH_PASS 0x0B96 -#define GL_STENCIL_REF 0x0B97 -#define GL_STENCIL_WRITEMASK 0x0B98 -#define GL_MATRIX_MODE 0x0BA0 -#define GL_NORMALIZE 0x0BA1 -#define GL_VIEWPORT 0x0BA2 -#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 -#define GL_PROJECTION_STACK_DEPTH 0x0BA4 -#define GL_TEXTURE_STACK_DEPTH 0x0BA5 -#define GL_MODELVIEW_MATRIX 0x0BA6 -#define GL_PROJECTION_MATRIX 0x0BA7 -#define GL_TEXTURE_MATRIX 0x0BA8 -#define GL_ATTRIB_STACK_DEPTH 0x0BB0 -#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 -#define GL_ALPHA_TEST 0x0BC0 -#define GL_ALPHA_TEST_FUNC 0x0BC1 -#define GL_ALPHA_TEST_REF 0x0BC2 -#define GL_DITHER 0x0BD0 -#define GL_BLEND_DST 0x0BE0 -#define GL_BLEND_SRC 0x0BE1 -#define GL_BLEND 0x0BE2 -#define GL_LOGIC_OP_MODE 0x0BF0 -#define GL_INDEX_LOGIC_OP 0x0BF1 -#define GL_COLOR_LOGIC_OP 0x0BF2 -#define GL_AUX_BUFFERS 0x0C00 -#define GL_DRAW_BUFFER 0x0C01 -#define GL_READ_BUFFER 0x0C02 -#define GL_SCISSOR_BOX 0x0C10 -#define GL_SCISSOR_TEST 0x0C11 -#define GL_INDEX_CLEAR_VALUE 0x0C20 -#define GL_INDEX_WRITEMASK 0x0C21 -#define GL_COLOR_CLEAR_VALUE 0x0C22 -#define GL_COLOR_WRITEMASK 0x0C23 -#define GL_INDEX_MODE 0x0C30 -#define GL_RGBA_MODE 0x0C31 -#define GL_DOUBLEBUFFER 0x0C32 -#define GL_STEREO 0x0C33 -#define GL_RENDER_MODE 0x0C40 -#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 -#define GL_POINT_SMOOTH_HINT 0x0C51 -#define GL_LINE_SMOOTH_HINT 0x0C52 -#define GL_POLYGON_SMOOTH_HINT 0x0C53 -#define GL_FOG_HINT 0x0C54 -#define GL_TEXTURE_GEN_S 0x0C60 -#define GL_TEXTURE_GEN_T 0x0C61 -#define GL_TEXTURE_GEN_R 0x0C62 -#define GL_TEXTURE_GEN_Q 0x0C63 -#define GL_PIXEL_MAP_I_TO_I 0x0C70 -#define GL_PIXEL_MAP_S_TO_S 0x0C71 -#define GL_PIXEL_MAP_I_TO_R 0x0C72 -#define GL_PIXEL_MAP_I_TO_G 0x0C73 -#define GL_PIXEL_MAP_I_TO_B 0x0C74 -#define GL_PIXEL_MAP_I_TO_A 0x0C75 -#define GL_PIXEL_MAP_R_TO_R 0x0C76 -#define GL_PIXEL_MAP_G_TO_G 0x0C77 -#define GL_PIXEL_MAP_B_TO_B 0x0C78 -#define GL_PIXEL_MAP_A_TO_A 0x0C79 -#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 -#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 -#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 -#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 -#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 -#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 -#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 -#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 -#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 -#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 -#define GL_UNPACK_SWAP_BYTES 0x0CF0 -#define GL_UNPACK_LSB_FIRST 0x0CF1 -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#define GL_UNPACK_SKIP_ROWS 0x0CF3 -#define GL_UNPACK_SKIP_PIXELS 0x0CF4 -#define GL_UNPACK_ALIGNMENT 0x0CF5 -#define GL_PACK_SWAP_BYTES 0x0D00 -#define GL_PACK_LSB_FIRST 0x0D01 -#define GL_PACK_ROW_LENGTH 0x0D02 -#define GL_PACK_SKIP_ROWS 0x0D03 -#define GL_PACK_SKIP_PIXELS 0x0D04 -#define GL_PACK_ALIGNMENT 0x0D05 -#define GL_MAP_COLOR 0x0D10 -#define GL_MAP_STENCIL 0x0D11 -#define GL_INDEX_SHIFT 0x0D12 -#define GL_INDEX_OFFSET 0x0D13 -#define GL_RED_SCALE 0x0D14 -#define GL_RED_BIAS 0x0D15 -#define GL_ZOOM_X 0x0D16 -#define GL_ZOOM_Y 0x0D17 -#define GL_GREEN_SCALE 0x0D18 -#define GL_GREEN_BIAS 0x0D19 -#define GL_BLUE_SCALE 0x0D1A -#define GL_BLUE_BIAS 0x0D1B -#define GL_ALPHA_SCALE 0x0D1C -#define GL_ALPHA_BIAS 0x0D1D -#define GL_DEPTH_SCALE 0x0D1E -#define GL_DEPTH_BIAS 0x0D1F -#define GL_MAX_EVAL_ORDER 0x0D30 -#define GL_MAX_LIGHTS 0x0D31 -#define GL_MAX_CLIP_PLANES 0x0D32 -#define GL_MAX_TEXTURE_SIZE 0x0D33 -#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 -#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 -#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 -#define GL_MAX_NAME_STACK_DEPTH 0x0D37 -#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 -#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 -#define GL_MAX_VIEWPORT_DIMS 0x0D3A -#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B -#define GL_SUBPIXEL_BITS 0x0D50 -#define GL_INDEX_BITS 0x0D51 -#define GL_RED_BITS 0x0D52 -#define GL_GREEN_BITS 0x0D53 -#define GL_BLUE_BITS 0x0D54 -#define GL_ALPHA_BITS 0x0D55 -#define GL_DEPTH_BITS 0x0D56 -#define GL_STENCIL_BITS 0x0D57 -#define GL_ACCUM_RED_BITS 0x0D58 -#define GL_ACCUM_GREEN_BITS 0x0D59 -#define GL_ACCUM_BLUE_BITS 0x0D5A -#define GL_ACCUM_ALPHA_BITS 0x0D5B -#define GL_NAME_STACK_DEPTH 0x0D70 -#define GL_AUTO_NORMAL 0x0D80 -#define GL_MAP1_COLOR_4 0x0D90 -#define GL_MAP1_INDEX 0x0D91 -#define GL_MAP1_NORMAL 0x0D92 -#define GL_MAP1_TEXTURE_COORD_1 0x0D93 -#define GL_MAP1_TEXTURE_COORD_2 0x0D94 -#define GL_MAP1_TEXTURE_COORD_3 0x0D95 -#define GL_MAP1_TEXTURE_COORD_4 0x0D96 -#define GL_MAP1_VERTEX_3 0x0D97 -#define GL_MAP1_VERTEX_4 0x0D98 -#define GL_MAP2_COLOR_4 0x0DB0 -#define GL_MAP2_INDEX 0x0DB1 -#define GL_MAP2_NORMAL 0x0DB2 -#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 -#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 -#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 -#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 -#define GL_MAP2_VERTEX_3 0x0DB7 -#define GL_MAP2_VERTEX_4 0x0DB8 -#define GL_MAP1_GRID_DOMAIN 0x0DD0 -#define GL_MAP1_GRID_SEGMENTS 0x0DD1 -#define GL_MAP2_GRID_DOMAIN 0x0DD2 -#define GL_MAP2_GRID_SEGMENTS 0x0DD3 -#define GL_TEXTURE_1D 0x0DE0 -#define GL_TEXTURE_2D 0x0DE1 -#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 -#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 -#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 -#define GL_SELECTION_BUFFER_POINTER 0x0DF3 -#define GL_SELECTION_BUFFER_SIZE 0x0DF4 -/* GL_TEXTURE_BINDING_1D */ -/* GL_TEXTURE_BINDING_2D */ -/* GL_VERTEX_ARRAY */ -/* GL_NORMAL_ARRAY */ -/* GL_COLOR_ARRAY */ -/* GL_INDEX_ARRAY */ -/* GL_TEXTURE_COORD_ARRAY */ -/* GL_EDGE_FLAG_ARRAY */ -/* GL_VERTEX_ARRAY_SIZE */ -/* GL_VERTEX_ARRAY_TYPE */ -/* GL_VERTEX_ARRAY_STRIDE */ -/* GL_NORMAL_ARRAY_TYPE */ -/* GL_NORMAL_ARRAY_STRIDE */ -/* GL_COLOR_ARRAY_SIZE */ -/* GL_COLOR_ARRAY_TYPE */ -/* GL_COLOR_ARRAY_STRIDE */ -/* GL_INDEX_ARRAY_TYPE */ -/* GL_INDEX_ARRAY_STRIDE */ -/* GL_TEXTURE_COORD_ARRAY_SIZE */ -/* GL_TEXTURE_COORD_ARRAY_TYPE */ -/* GL_TEXTURE_COORD_ARRAY_STRIDE */ -/* GL_EDGE_FLAG_ARRAY_STRIDE */ -/* GL_POLYGON_OFFSET_FACTOR */ -/* GL_POLYGON_OFFSET_UNITS */ - -/* GetTextureParameter */ -/* GL_TEXTURE_MAG_FILTER */ -/* GL_TEXTURE_MIN_FILTER */ -/* GL_TEXTURE_WRAP_S */ -/* GL_TEXTURE_WRAP_T */ -#define GL_TEXTURE_WIDTH 0x1000 -#define GL_TEXTURE_HEIGHT 0x1001 -#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 -#define GL_TEXTURE_BORDER_COLOR 0x1004 -#define GL_TEXTURE_BORDER 0x1005 -/* GL_TEXTURE_RED_SIZE */ -/* GL_TEXTURE_GREEN_SIZE */ -/* GL_TEXTURE_BLUE_SIZE */ -/* GL_TEXTURE_ALPHA_SIZE */ -/* GL_TEXTURE_LUMINANCE_SIZE */ -/* GL_TEXTURE_INTENSITY_SIZE */ -/* GL_TEXTURE_PRIORITY */ -/* GL_TEXTURE_RESIDENT */ - -/* HintMode */ -#define GL_DONT_CARE 0x1100 -#define GL_FASTEST 0x1101 -#define GL_NICEST 0x1102 - -/* HintTarget */ -/* GL_PERSPECTIVE_CORRECTION_HINT */ -/* GL_POINT_SMOOTH_HINT */ -/* GL_LINE_SMOOTH_HINT */ -/* GL_POLYGON_SMOOTH_HINT */ -/* GL_FOG_HINT */ -/* GL_PHONG_HINT */ - -/* IndexPointerType */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* LightModelParameter */ -/* GL_LIGHT_MODEL_AMBIENT */ -/* GL_LIGHT_MODEL_LOCAL_VIEWER */ -/* GL_LIGHT_MODEL_TWO_SIDE */ - -/* LightName */ -#define GL_LIGHT0 0x4000 -#define GL_LIGHT1 0x4001 -#define GL_LIGHT2 0x4002 -#define GL_LIGHT3 0x4003 -#define GL_LIGHT4 0x4004 -#define GL_LIGHT5 0x4005 -#define GL_LIGHT6 0x4006 -#define GL_LIGHT7 0x4007 - -/* LightParameter */ -#define GL_AMBIENT 0x1200 -#define GL_DIFFUSE 0x1201 -#define GL_SPECULAR 0x1202 -#define GL_POSITION 0x1203 -#define GL_SPOT_DIRECTION 0x1204 -#define GL_SPOT_EXPONENT 0x1205 -#define GL_SPOT_CUTOFF 0x1206 -#define GL_CONSTANT_ATTENUATION 0x1207 -#define GL_LINEAR_ATTENUATION 0x1208 -#define GL_QUADRATIC_ATTENUATION 0x1209 - -/* InterleavedArrays */ -/* GL_V2F */ -/* GL_V3F */ -/* GL_C4UB_V2F */ -/* GL_C4UB_V3F */ -/* GL_C3F_V3F */ -/* GL_N3F_V3F */ -/* GL_C4F_N3F_V3F */ -/* GL_T2F_V3F */ -/* GL_T4F_V4F */ -/* GL_T2F_C4UB_V3F */ -/* GL_T2F_C3F_V3F */ -/* GL_T2F_N3F_V3F */ -/* GL_T2F_C4F_N3F_V3F */ -/* GL_T4F_C4F_N3F_V4F */ - -/* ListMode */ -#define GL_COMPILE 0x1300 -#define GL_COMPILE_AND_EXECUTE 0x1301 - -/* ListNameType */ -/* GL_BYTE */ -/* GL_UNSIGNED_BYTE */ -/* GL_SHORT */ -/* GL_UNSIGNED_SHORT */ -/* GL_INT */ -/* GL_UNSIGNED_INT */ -/* GL_FLOAT */ -/* GL_2_BYTES */ -/* GL_3_BYTES */ -/* GL_4_BYTES */ - -/* LogicOp */ -#define GL_CLEAR 0x1500 -#define GL_AND 0x1501 -#define GL_AND_REVERSE 0x1502 -#define GL_COPY 0x1503 -#define GL_AND_INVERTED 0x1504 -#define GL_NOOP 0x1505 -#define GL_XOR 0x1506 -#define GL_OR 0x1507 -#define GL_NOR 0x1508 -#define GL_EQUIV 0x1509 -#define GL_INVERT 0x150A -#define GL_OR_REVERSE 0x150B -#define GL_COPY_INVERTED 0x150C -#define GL_OR_INVERTED 0x150D -#define GL_NAND 0x150E -#define GL_SET 0x150F - -/* MapTarget */ -/* GL_MAP1_COLOR_4 */ -/* GL_MAP1_INDEX */ -/* GL_MAP1_NORMAL */ -/* GL_MAP1_TEXTURE_COORD_1 */ -/* GL_MAP1_TEXTURE_COORD_2 */ -/* GL_MAP1_TEXTURE_COORD_3 */ -/* GL_MAP1_TEXTURE_COORD_4 */ -/* GL_MAP1_VERTEX_3 */ -/* GL_MAP1_VERTEX_4 */ -/* GL_MAP2_COLOR_4 */ -/* GL_MAP2_INDEX */ -/* GL_MAP2_NORMAL */ -/* GL_MAP2_TEXTURE_COORD_1 */ -/* GL_MAP2_TEXTURE_COORD_2 */ -/* GL_MAP2_TEXTURE_COORD_3 */ -/* GL_MAP2_TEXTURE_COORD_4 */ -/* GL_MAP2_VERTEX_3 */ -/* GL_MAP2_VERTEX_4 */ - -/* MaterialFace */ -/* GL_FRONT */ -/* GL_BACK */ -/* GL_FRONT_AND_BACK */ - -/* MaterialParameter */ -#define GL_EMISSION 0x1600 -#define GL_SHININESS 0x1601 -#define GL_AMBIENT_AND_DIFFUSE 0x1602 -#define GL_COLOR_INDEXES 0x1603 -/* GL_AMBIENT */ -/* GL_DIFFUSE */ -/* GL_SPECULAR */ - -/* MatrixMode */ -#define GL_MODELVIEW 0x1700 -#define GL_PROJECTION 0x1701 -#define GL_TEXTURE 0x1702 - -/* MeshMode1 */ -/* GL_POINT */ -/* GL_LINE */ - -/* MeshMode2 */ -/* GL_POINT */ -/* GL_LINE */ -/* GL_FILL */ - -/* NormalPointerType */ -/* GL_BYTE */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* PixelCopyType */ -#define GL_COLOR 0x1800 -#define GL_DEPTH 0x1801 -#define GL_STENCIL 0x1802 - -/* PixelFormat */ -#define GL_COLOR_INDEX 0x1900 -#define GL_STENCIL_INDEX 0x1901 -#define GL_DEPTH_COMPONENT 0x1902 -#define GL_RED 0x1903 -#define GL_GREEN 0x1904 -#define GL_BLUE 0x1905 -#define GL_ALPHA 0x1906 -#define GL_RGB 0x1907 -#define GL_RGBA 0x1908 -#define GL_LUMINANCE 0x1909 -#define GL_LUMINANCE_ALPHA 0x190A - -/* PixelMap */ -/* GL_PIXEL_MAP_I_TO_I */ -/* GL_PIXEL_MAP_S_TO_S */ -/* GL_PIXEL_MAP_I_TO_R */ -/* GL_PIXEL_MAP_I_TO_G */ -/* GL_PIXEL_MAP_I_TO_B */ -/* GL_PIXEL_MAP_I_TO_A */ -/* GL_PIXEL_MAP_R_TO_R */ -/* GL_PIXEL_MAP_G_TO_G */ -/* GL_PIXEL_MAP_B_TO_B */ -/* GL_PIXEL_MAP_A_TO_A */ - -/* PixelStore */ -/* GL_UNPACK_SWAP_BYTES */ -/* GL_UNPACK_LSB_FIRST */ -/* GL_UNPACK_ROW_LENGTH */ -/* GL_UNPACK_SKIP_ROWS */ -/* GL_UNPACK_SKIP_PIXELS */ -/* GL_UNPACK_ALIGNMENT */ -/* GL_PACK_SWAP_BYTES */ -/* GL_PACK_LSB_FIRST */ -/* GL_PACK_ROW_LENGTH */ -/* GL_PACK_SKIP_ROWS */ -/* GL_PACK_SKIP_PIXELS */ -/* GL_PACK_ALIGNMENT */ - -/* PixelTransfer */ -/* GL_MAP_COLOR */ -/* GL_MAP_STENCIL */ -/* GL_INDEX_SHIFT */ -/* GL_INDEX_OFFSET */ -/* GL_RED_SCALE */ -/* GL_RED_BIAS */ -/* GL_GREEN_SCALE */ -/* GL_GREEN_BIAS */ -/* GL_BLUE_SCALE */ -/* GL_BLUE_BIAS */ -/* GL_ALPHA_SCALE */ -/* GL_ALPHA_BIAS */ -/* GL_DEPTH_SCALE */ -/* GL_DEPTH_BIAS */ - -/* PixelType */ -#define GL_BITMAP 0x1A00 -/* GL_BYTE */ -/* GL_UNSIGNED_BYTE */ -/* GL_SHORT */ -/* GL_UNSIGNED_SHORT */ -/* GL_INT */ -/* GL_UNSIGNED_INT */ -/* GL_FLOAT */ - -/* PolygonMode */ -#define GL_POINT 0x1B00 -#define GL_LINE 0x1B01 -#define GL_FILL 0x1B02 - -/* ReadBufferMode */ -/* GL_FRONT_LEFT */ -/* GL_FRONT_RIGHT */ -/* GL_BACK_LEFT */ -/* GL_BACK_RIGHT */ -/* GL_FRONT */ -/* GL_BACK */ -/* GL_LEFT */ -/* GL_RIGHT */ -/* GL_AUX0 */ -/* GL_AUX1 */ -/* GL_AUX2 */ -/* GL_AUX3 */ - -/* RenderingMode */ -#define GL_RENDER 0x1C00 -#define GL_FEEDBACK 0x1C01 -#define GL_SELECT 0x1C02 - -/* ShadingModel */ -#define GL_FLAT 0x1D00 -#define GL_SMOOTH 0x1D01 - - -/* StencilFunction */ -/* GL_NEVER */ -/* GL_LESS */ -/* GL_EQUAL */ -/* GL_LEQUAL */ -/* GL_GREATER */ -/* GL_NOTEQUAL */ -/* GL_GEQUAL */ -/* GL_ALWAYS */ - -/* StencilOp */ -/* GL_ZERO */ -#define GL_KEEP 0x1E00 -#define GL_REPLACE 0x1E01 -#define GL_INCR 0x1E02 -#define GL_DECR 0x1E03 -/* GL_INVERT */ - -/* StringName */ -#define GL_VENDOR 0x1F00 -#define GL_RENDERER 0x1F01 -#define GL_VERSION 0x1F02 -#define GL_EXTENSIONS 0x1F03 - -/* TextureCoordName */ -#define GL_S 0x2000 -#define GL_T 0x2001 -#define GL_R 0x2002 -#define GL_Q 0x2003 - -/* TexCoordPointerType */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* TextureEnvMode */ -#define GL_MODULATE 0x2100 -#define GL_DECAL 0x2101 -/* GL_BLEND */ -/* GL_REPLACE */ - -/* TextureEnvParameter */ -#define GL_TEXTURE_ENV_MODE 0x2200 -#define GL_TEXTURE_ENV_COLOR 0x2201 - -/* TextureEnvTarget */ -#define GL_TEXTURE_ENV 0x2300 - -/* TextureGenMode */ -#define GL_EYE_LINEAR 0x2400 -#define GL_OBJECT_LINEAR 0x2401 -#define GL_SPHERE_MAP 0x2402 - -/* TextureGenParameter */ -#define GL_TEXTURE_GEN_MODE 0x2500 -#define GL_OBJECT_PLANE 0x2501 -#define GL_EYE_PLANE 0x2502 - -/* TextureMagFilter */ -#define GL_NEAREST 0x2600 -#define GL_LINEAR 0x2601 - -/* TextureMinFilter */ -/* GL_NEAREST */ -/* GL_LINEAR */ -#define GL_NEAREST_MIPMAP_NEAREST 0x2700 -#define GL_LINEAR_MIPMAP_NEAREST 0x2701 -#define GL_NEAREST_MIPMAP_LINEAR 0x2702 -#define GL_LINEAR_MIPMAP_LINEAR 0x2703 - -/* TextureParameterName */ -#define GL_TEXTURE_MAG_FILTER 0x2800 -#define GL_TEXTURE_MIN_FILTER 0x2801 -#define GL_TEXTURE_WRAP_S 0x2802 -#define GL_TEXTURE_WRAP_T 0x2803 -/* GL_TEXTURE_BORDER_COLOR */ -/* GL_TEXTURE_PRIORITY */ - -/* TextureTarget */ -/* GL_TEXTURE_1D */ -/* GL_TEXTURE_2D */ -/* GL_PROXY_TEXTURE_1D */ -/* GL_PROXY_TEXTURE_2D */ - -/* TextureWrapMode */ -#define GL_CLAMP 0x2900 -#define GL_REPEAT 0x2901 - -/* VertexPointerType */ -/* GL_SHORT */ -/* GL_INT */ -/* GL_FLOAT */ -/* GL_DOUBLE */ - -/* ClientAttribMask */ -#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 -#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 -#define GL_CLIENT_ALL_ATTRIB_BITS 0xffffffff - -/* polygon_offset */ -#define GL_POLYGON_OFFSET_FACTOR 0x8038 -#define GL_POLYGON_OFFSET_UNITS 0x2A00 -#define GL_POLYGON_OFFSET_POINT 0x2A01 -#define GL_POLYGON_OFFSET_LINE 0x2A02 -#define GL_POLYGON_OFFSET_FILL 0x8037 - -/* texture */ -#define GL_ALPHA4 0x803B -#define GL_ALPHA8 0x803C -#define GL_ALPHA12 0x803D -#define GL_ALPHA16 0x803E -#define GL_LUMINANCE4 0x803F -#define GL_LUMINANCE8 0x8040 -#define GL_LUMINANCE12 0x8041 -#define GL_LUMINANCE16 0x8042 -#define GL_LUMINANCE4_ALPHA4 0x8043 -#define GL_LUMINANCE6_ALPHA2 0x8044 -#define GL_LUMINANCE8_ALPHA8 0x8045 -#define GL_LUMINANCE12_ALPHA4 0x8046 -#define GL_LUMINANCE12_ALPHA12 0x8047 -#define GL_LUMINANCE16_ALPHA16 0x8048 -#define GL_INTENSITY 0x8049 -#define GL_INTENSITY4 0x804A -#define GL_INTENSITY8 0x804B -#define GL_INTENSITY12 0x804C -#define GL_INTENSITY16 0x804D -#define GL_R3_G3_B2 0x2A10 -#define GL_RGB4 0x804F -#define GL_RGB5 0x8050 -#define GL_RGB8 0x8051 -#define GL_RGB10 0x8052 -#define GL_RGB12 0x8053 -#define GL_RGB16 0x8054 -#define GL_RGBA2 0x8055 -#define GL_RGBA4 0x8056 -#define GL_RGB5_A1 0x8057 -#define GL_RGBA8 0x8058 -#define GL_RGB10_A2 0x8059 -#define GL_RGBA12 0x805A -#define GL_RGBA16 0x805B -#define GL_TEXTURE_RED_SIZE 0x805C -#define GL_TEXTURE_GREEN_SIZE 0x805D -#define GL_TEXTURE_BLUE_SIZE 0x805E -#define GL_TEXTURE_ALPHA_SIZE 0x805F -#define GL_TEXTURE_LUMINANCE_SIZE 0x8060 -#define GL_TEXTURE_INTENSITY_SIZE 0x8061 -#define GL_PROXY_TEXTURE_1D 0x8063 -#define GL_PROXY_TEXTURE_2D 0x8064 - -/* texture_object */ -#define GL_TEXTURE_PRIORITY 0x8066 -#define GL_TEXTURE_RESIDENT 0x8067 -#define GL_TEXTURE_BINDING_1D 0x8068 -#define GL_TEXTURE_BINDING_2D 0x8069 - -/* vertex_array */ -#define GL_VERTEX_ARRAY 0x8074 -#define GL_NORMAL_ARRAY 0x8075 -#define GL_COLOR_ARRAY 0x8076 -#define GL_INDEX_ARRAY 0x8077 -#define GL_TEXTURE_COORD_ARRAY 0x8078 -#define GL_EDGE_FLAG_ARRAY 0x8079 -#define GL_VERTEX_ARRAY_SIZE 0x807A -#define GL_VERTEX_ARRAY_TYPE 0x807B -#define GL_VERTEX_ARRAY_STRIDE 0x807C -#define GL_NORMAL_ARRAY_TYPE 0x807E -#define GL_NORMAL_ARRAY_STRIDE 0x807F -#define GL_COLOR_ARRAY_SIZE 0x8081 -#define GL_COLOR_ARRAY_TYPE 0x8082 -#define GL_COLOR_ARRAY_STRIDE 0x8083 -#define GL_INDEX_ARRAY_TYPE 0x8085 -#define GL_INDEX_ARRAY_STRIDE 0x8086 -#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 -#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 -#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A -#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C -#define GL_VERTEX_ARRAY_POINTER 0x808E -#define GL_NORMAL_ARRAY_POINTER 0x808F -#define GL_COLOR_ARRAY_POINTER 0x8090 -#define GL_INDEX_ARRAY_POINTER 0x8091 -#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 -#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 -#define GL_V2F 0x2A20 -#define GL_V3F 0x2A21 -#define GL_C4UB_V2F 0x2A22 -#define GL_C4UB_V3F 0x2A23 -#define GL_C3F_V3F 0x2A24 -#define GL_N3F_V3F 0x2A25 -#define GL_C4F_N3F_V3F 0x2A26 -#define GL_T2F_V3F 0x2A27 -#define GL_T4F_V4F 0x2A28 -#define GL_T2F_C4UB_V3F 0x2A29 -#define GL_T2F_C3F_V3F 0x2A2A -#define GL_T2F_N3F_V3F 0x2A2B -#define GL_T2F_C4F_N3F_V3F 0x2A2C -#define GL_T4F_C4F_N3F_V4F 0x2A2D - -/* Extensions */ -#define GL_EXT_vertex_array 1 -#define GL_EXT_bgra 1 -#define GL_EXT_paletted_texture 1 -#define GL_WIN_swap_hint 1 -#define GL_WIN_draw_range_elements 1 -// #define GL_WIN_phong_shading 1 -// #define GL_WIN_specular_fog 1 - -/* EXT_vertex_array */ -#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 -#define GL_DOUBLE_EXT GL_DOUBLE - -/* EXT_bgra */ -#define GL_BGR_EXT 0x80E0 -#define GL_BGRA_EXT 0x80E1 - -/* EXT_paletted_texture */ - -/* These must match the GL_COLOR_TABLE_*_SGI enumerants */ -#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_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 - -/* WIN_draw_range_elements */ -#define GL_MAX_ELEMENTS_VERTICES_WIN 0x80E8 -#define GL_MAX_ELEMENTS_INDICES_WIN 0x80E9 - -/* WIN_phong_shading */ -#define GL_PHONG_WIN 0x80EA -#define GL_PHONG_HINT_WIN 0x80EB - -/* WIN_specular_fog */ -#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC - -/* For compatibility with OpenGL v1.0 */ -#define GL_LOGIC_OP GL_INDEX_LOGIC_OP -#define GL_TEXTURE_COMPONENTS GL_TEXTURE_INTERNAL_FORMAT - -/*************************************************************/ - -WINGDIAPI void APIENTRY glAccum (GLenum op, GLfloat value); -WINGDIAPI void APIENTRY glAlphaFunc (GLenum func, GLclampf ref); -WINGDIAPI GLboolean APIENTRY glAreTexturesResident (GLsizei n, const GLuint *textures, GLboolean *residences); -WINGDIAPI void APIENTRY glArrayElement (GLint i); -WINGDIAPI void APIENTRY glBegin (GLenum mode); -WINGDIAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); -WINGDIAPI void APIENTRY glBitmap (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap); -WINGDIAPI void APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); -WINGDIAPI void APIENTRY glCallList (GLuint list); -WINGDIAPI void APIENTRY glCallLists (GLsizei n, GLenum type, const GLvoid *lists); -WINGDIAPI void APIENTRY glClear (GLbitfield mask); -WINGDIAPI void APIENTRY glClearAccum (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -WINGDIAPI void APIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); -WINGDIAPI void APIENTRY glClearDepth (GLclampd depth); -WINGDIAPI void APIENTRY glClearIndex (GLfloat c); -WINGDIAPI void APIENTRY glClearStencil (GLint s); -WINGDIAPI void APIENTRY glClipPlane (GLenum plane, const GLdouble *equation); -WINGDIAPI void APIENTRY glColor3b (GLbyte red, GLbyte green, GLbyte blue); -WINGDIAPI void APIENTRY glColor3bv (const GLbyte *v); -WINGDIAPI void APIENTRY glColor3d (GLdouble red, GLdouble green, GLdouble blue); -WINGDIAPI void APIENTRY glColor3dv (const GLdouble *v); -WINGDIAPI void APIENTRY glColor3f (GLfloat red, GLfloat green, GLfloat blue); -WINGDIAPI void APIENTRY glColor3fv (const GLfloat *v); -WINGDIAPI void APIENTRY glColor3i (GLint red, GLint green, GLint blue); -WINGDIAPI void APIENTRY glColor3iv (const GLint *v); -WINGDIAPI void APIENTRY glColor3s (GLshort red, GLshort green, GLshort blue); -WINGDIAPI void APIENTRY glColor3sv (const GLshort *v); -WINGDIAPI void APIENTRY glColor3ub (GLubyte red, GLubyte green, GLubyte blue); -WINGDIAPI void APIENTRY glColor3ubv (const GLubyte *v); -WINGDIAPI void APIENTRY glColor3ui (GLuint red, GLuint green, GLuint blue); -WINGDIAPI void APIENTRY glColor3uiv (const GLuint *v); -WINGDIAPI void APIENTRY glColor3us (GLushort red, GLushort green, GLushort blue); -WINGDIAPI void APIENTRY glColor3usv (const GLushort *v); -WINGDIAPI void APIENTRY glColor4b (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha); -WINGDIAPI void APIENTRY glColor4bv (const GLbyte *v); -WINGDIAPI void APIENTRY glColor4d (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha); -WINGDIAPI void APIENTRY glColor4dv (const GLdouble *v); -WINGDIAPI void APIENTRY glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); -WINGDIAPI void APIENTRY glColor4fv (const GLfloat *v); -WINGDIAPI void APIENTRY glColor4i (GLint red, GLint green, GLint blue, GLint alpha); -WINGDIAPI void APIENTRY glColor4iv (const GLint *v); -WINGDIAPI void APIENTRY glColor4s (GLshort red, GLshort green, GLshort blue, GLshort alpha); -WINGDIAPI void APIENTRY glColor4sv (const GLshort *v); -WINGDIAPI void APIENTRY glColor4ub (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); -WINGDIAPI void APIENTRY glColor4ubv (const GLubyte *v); -WINGDIAPI void APIENTRY glColor4ui (GLuint red, GLuint green, GLuint blue, GLuint alpha); -WINGDIAPI void APIENTRY glColor4uiv (const GLuint *v); -WINGDIAPI void APIENTRY glColor4us (GLushort red, GLushort green, GLushort blue, GLushort alpha); -WINGDIAPI void APIENTRY glColor4usv (const GLushort *v); -WINGDIAPI void APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); -WINGDIAPI void APIENTRY glColorMaterial (GLenum face, GLenum mode); -WINGDIAPI void APIENTRY glColorPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glCopyPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type); -WINGDIAPI void APIENTRY glCopyTexImage1D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border); -WINGDIAPI void APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); -WINGDIAPI void APIENTRY glCopyTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); -WINGDIAPI void APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -WINGDIAPI void APIENTRY glCullFace (GLenum mode); -WINGDIAPI void APIENTRY glDeleteLists (GLuint list, GLsizei range); -WINGDIAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); -WINGDIAPI void APIENTRY glDepthFunc (GLenum func); -WINGDIAPI void APIENTRY glDepthMask (GLboolean flag); -WINGDIAPI void APIENTRY glDepthRange (GLclampd zNear, GLclampd zFar); -WINGDIAPI void APIENTRY glDisable (GLenum cap); -WINGDIAPI void APIENTRY glDisableClientState (GLenum array); -WINGDIAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); -WINGDIAPI void APIENTRY glDrawBuffer (GLenum mode); -WINGDIAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -WINGDIAPI void APIENTRY glDrawPixels (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -WINGDIAPI void APIENTRY glEdgeFlag (GLboolean flag); -WINGDIAPI void APIENTRY glEdgeFlagPointer (GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glEdgeFlagv (const GLboolean *flag); -WINGDIAPI void APIENTRY glEnable (GLenum cap); -WINGDIAPI void APIENTRY glEnableClientState (GLenum array); -WINGDIAPI void APIENTRY glEnd (void); -WINGDIAPI void APIENTRY glEndList (void); -WINGDIAPI void APIENTRY glEvalCoord1d (GLdouble u); -WINGDIAPI void APIENTRY glEvalCoord1dv (const GLdouble *u); -WINGDIAPI void APIENTRY glEvalCoord1f (GLfloat u); -WINGDIAPI void APIENTRY glEvalCoord1fv (const GLfloat *u); -WINGDIAPI void APIENTRY glEvalCoord2d (GLdouble u, GLdouble v); -WINGDIAPI void APIENTRY glEvalCoord2dv (const GLdouble *u); -WINGDIAPI void APIENTRY glEvalCoord2f (GLfloat u, GLfloat v); -WINGDIAPI void APIENTRY glEvalCoord2fv (const GLfloat *u); -WINGDIAPI void APIENTRY glEvalMesh1 (GLenum mode, GLint i1, GLint i2); -WINGDIAPI void APIENTRY glEvalMesh2 (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2); -WINGDIAPI void APIENTRY glEvalPoint1 (GLint i); -WINGDIAPI void APIENTRY glEvalPoint2 (GLint i, GLint j); -WINGDIAPI void APIENTRY glFeedbackBuffer (GLsizei size, GLenum type, GLfloat *buffer); -WINGDIAPI void APIENTRY glFinish (void); -WINGDIAPI void APIENTRY glFlush (void); -WINGDIAPI void APIENTRY glFogf (GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glFogfv (GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glFogi (GLenum pname, GLint param); -WINGDIAPI void APIENTRY glFogiv (GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glFrontFace (GLenum mode); -WINGDIAPI void APIENTRY glFrustum (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -WINGDIAPI GLuint APIENTRY glGenLists (GLsizei range); -WINGDIAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); -WINGDIAPI void APIENTRY glGetBooleanv (GLenum pname, GLboolean *params); -WINGDIAPI void APIENTRY glGetClipPlane (GLenum plane, GLdouble *equation); -WINGDIAPI void APIENTRY glGetDoublev (GLenum pname, GLdouble *params); -WINGDIAPI GLenum APIENTRY glGetError (void); -WINGDIAPI void APIENTRY glGetFloatv (GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetLightfv (GLenum light, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetLightiv (GLenum light, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetMapdv (GLenum target, GLenum query, GLdouble *v); -WINGDIAPI void APIENTRY glGetMapfv (GLenum target, GLenum query, GLfloat *v); -WINGDIAPI void APIENTRY glGetMapiv (GLenum target, GLenum query, GLint *v); -WINGDIAPI void APIENTRY glGetMaterialfv (GLenum face, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetMaterialiv (GLenum face, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetPixelMapfv (GLenum map, GLfloat *values); -WINGDIAPI void APIENTRY glGetPixelMapuiv (GLenum map, GLuint *values); -WINGDIAPI void APIENTRY glGetPixelMapusv (GLenum map, GLushort *values); -WINGDIAPI void APIENTRY glGetPointerv (GLenum pname, GLvoid* *params); -WINGDIAPI void APIENTRY glGetPolygonStipple (GLubyte *mask); -WINGDIAPI const GLubyte * APIENTRY glGetString (GLenum name); -WINGDIAPI void APIENTRY glGetTexEnvfv (GLenum target, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetTexEnviv (GLenum target, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetTexGendv (GLenum coord, GLenum pname, GLdouble *params); -WINGDIAPI void APIENTRY glGetTexGenfv (GLenum coord, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetTexGeniv (GLenum coord, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels); -WINGDIAPI void APIENTRY glGetTexLevelParameterfv (GLenum target, GLint level, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetTexLevelParameteriv (GLenum target, GLint level, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); -WINGDIAPI void APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); -WINGDIAPI void APIENTRY glHint (GLenum target, GLenum mode); -WINGDIAPI void APIENTRY glIndexMask (GLuint mask); -WINGDIAPI void APIENTRY glIndexPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glIndexd (GLdouble c); -WINGDIAPI void APIENTRY glIndexdv (const GLdouble *c); -WINGDIAPI void APIENTRY glIndexf (GLfloat c); -WINGDIAPI void APIENTRY glIndexfv (const GLfloat *c); -WINGDIAPI void APIENTRY glIndexi (GLint c); -WINGDIAPI void APIENTRY glIndexiv (const GLint *c); -WINGDIAPI void APIENTRY glIndexs (GLshort c); -WINGDIAPI void APIENTRY glIndexsv (const GLshort *c); -WINGDIAPI void APIENTRY glIndexub (GLubyte c); -WINGDIAPI void APIENTRY glIndexubv (const GLubyte *c); -WINGDIAPI void APIENTRY glInitNames (void); -WINGDIAPI void APIENTRY glInterleavedArrays (GLenum format, GLsizei stride, const GLvoid *pointer); -WINGDIAPI GLboolean APIENTRY glIsEnabled (GLenum cap); -WINGDIAPI GLboolean APIENTRY glIsList (GLuint list); -WINGDIAPI GLboolean APIENTRY glIsTexture (GLuint texture); -WINGDIAPI void APIENTRY glLightModelf (GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glLightModelfv (GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glLightModeli (GLenum pname, GLint param); -WINGDIAPI void APIENTRY glLightModeliv (GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glLightf (GLenum light, GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glLightfv (GLenum light, GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glLighti (GLenum light, GLenum pname, GLint param); -WINGDIAPI void APIENTRY glLightiv (GLenum light, GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glLineStipple (GLint factor, GLushort pattern); -WINGDIAPI void APIENTRY glLineWidth (GLfloat width); -WINGDIAPI void APIENTRY glListBase (GLuint base); -WINGDIAPI void APIENTRY glLoadIdentity (void); -WINGDIAPI void APIENTRY glLoadMatrixd (const GLdouble *m); -WINGDIAPI void APIENTRY glLoadMatrixf (const GLfloat *m); -WINGDIAPI void APIENTRY glLoadName (GLuint name); -WINGDIAPI void APIENTRY glLogicOp (GLenum opcode); -WINGDIAPI void APIENTRY glMap1d (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); -WINGDIAPI void APIENTRY glMap1f (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); -WINGDIAPI void APIENTRY glMap2d (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); -WINGDIAPI void APIENTRY glMap2f (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); -WINGDIAPI void APIENTRY glMapGrid1d (GLint un, GLdouble u1, GLdouble u2); -WINGDIAPI void APIENTRY glMapGrid1f (GLint un, GLfloat u1, GLfloat u2); -WINGDIAPI void APIENTRY glMapGrid2d (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2); -WINGDIAPI void APIENTRY glMapGrid2f (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2); -WINGDIAPI void APIENTRY glMaterialf (GLenum face, GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glMaterialfv (GLenum face, GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glMateriali (GLenum face, GLenum pname, GLint param); -WINGDIAPI void APIENTRY glMaterialiv (GLenum face, GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glMatrixMode (GLenum mode); -WINGDIAPI void APIENTRY glMultMatrixd (const GLdouble *m); -WINGDIAPI void APIENTRY glMultMatrixf (const GLfloat *m); -WINGDIAPI void APIENTRY glNewList (GLuint list, GLenum mode); -WINGDIAPI void APIENTRY glNormal3b (GLbyte nx, GLbyte ny, GLbyte nz); -WINGDIAPI void APIENTRY glNormal3bv (const GLbyte *v); -WINGDIAPI void APIENTRY glNormal3d (GLdouble nx, GLdouble ny, GLdouble nz); -WINGDIAPI void APIENTRY glNormal3dv (const GLdouble *v); -WINGDIAPI void APIENTRY glNormal3f (GLfloat nx, GLfloat ny, GLfloat nz); -WINGDIAPI void APIENTRY glNormal3fv (const GLfloat *v); -WINGDIAPI void APIENTRY glNormal3i (GLint nx, GLint ny, GLint nz); -WINGDIAPI void APIENTRY glNormal3iv (const GLint *v); -WINGDIAPI void APIENTRY glNormal3s (GLshort nx, GLshort ny, GLshort nz); -WINGDIAPI void APIENTRY glNormal3sv (const GLshort *v); -WINGDIAPI void APIENTRY glNormalPointer (GLenum type, GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glOrtho (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); -WINGDIAPI void APIENTRY glPassThrough (GLfloat token); -WINGDIAPI void APIENTRY glPixelMapfv (GLenum map, GLsizei mapsize, const GLfloat *values); -WINGDIAPI void APIENTRY glPixelMapuiv (GLenum map, GLsizei mapsize, const GLuint *values); -WINGDIAPI void APIENTRY glPixelMapusv (GLenum map, GLsizei mapsize, const GLushort *values); -WINGDIAPI void APIENTRY glPixelStoref (GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); -WINGDIAPI void APIENTRY glPixelTransferf (GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glPixelTransferi (GLenum pname, GLint param); -WINGDIAPI void APIENTRY glPixelZoom (GLfloat xfactor, GLfloat yfactor); -WINGDIAPI void APIENTRY glPointSize (GLfloat size); -WINGDIAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); -WINGDIAPI void APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); -WINGDIAPI void APIENTRY glPolygonStipple (const GLubyte *mask); -WINGDIAPI void APIENTRY glPopAttrib (void); -WINGDIAPI void APIENTRY glPopClientAttrib (void); -WINGDIAPI void APIENTRY glPopMatrix (void); -WINGDIAPI void APIENTRY glPopName (void); -WINGDIAPI void APIENTRY glPrioritizeTextures (GLsizei n, const GLuint *textures, const GLclampf *priorities); -WINGDIAPI void APIENTRY glPushAttrib (GLbitfield mask); -WINGDIAPI void APIENTRY glPushClientAttrib (GLbitfield mask); -WINGDIAPI void APIENTRY glPushMatrix (void); -WINGDIAPI void APIENTRY glPushName (GLuint name); -WINGDIAPI void APIENTRY glRasterPos2d (GLdouble x, GLdouble y); -WINGDIAPI void APIENTRY glRasterPos2dv (const GLdouble *v); -WINGDIAPI void APIENTRY glRasterPos2f (GLfloat x, GLfloat y); -WINGDIAPI void APIENTRY glRasterPos2fv (const GLfloat *v); -WINGDIAPI void APIENTRY glRasterPos2i (GLint x, GLint y); -WINGDIAPI void APIENTRY glRasterPos2iv (const GLint *v); -WINGDIAPI void APIENTRY glRasterPos2s (GLshort x, GLshort y); -WINGDIAPI void APIENTRY glRasterPos2sv (const GLshort *v); -WINGDIAPI void APIENTRY glRasterPos3d (GLdouble x, GLdouble y, GLdouble z); -WINGDIAPI void APIENTRY glRasterPos3dv (const GLdouble *v); -WINGDIAPI void APIENTRY glRasterPos3f (GLfloat x, GLfloat y, GLfloat z); -WINGDIAPI void APIENTRY glRasterPos3fv (const GLfloat *v); -WINGDIAPI void APIENTRY glRasterPos3i (GLint x, GLint y, GLint z); -WINGDIAPI void APIENTRY glRasterPos3iv (const GLint *v); -WINGDIAPI void APIENTRY glRasterPos3s (GLshort x, GLshort y, GLshort z); -WINGDIAPI void APIENTRY glRasterPos3sv (const GLshort *v); -WINGDIAPI void APIENTRY glRasterPos4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -WINGDIAPI void APIENTRY glRasterPos4dv (const GLdouble *v); -WINGDIAPI void APIENTRY glRasterPos4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -WINGDIAPI void APIENTRY glRasterPos4fv (const GLfloat *v); -WINGDIAPI void APIENTRY glRasterPos4i (GLint x, GLint y, GLint z, GLint w); -WINGDIAPI void APIENTRY glRasterPos4iv (const GLint *v); -WINGDIAPI void APIENTRY glRasterPos4s (GLshort x, GLshort y, GLshort z, GLshort w); -WINGDIAPI void APIENTRY glRasterPos4sv (const GLshort *v); -WINGDIAPI void APIENTRY glReadBuffer (GLenum mode); -WINGDIAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels); -WINGDIAPI void APIENTRY glRectd (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2); -WINGDIAPI void APIENTRY glRectdv (const GLdouble *v1, const GLdouble *v2); -WINGDIAPI void APIENTRY glRectf (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2); -WINGDIAPI void APIENTRY glRectfv (const GLfloat *v1, const GLfloat *v2); -WINGDIAPI void APIENTRY glRecti (GLint x1, GLint y1, GLint x2, GLint y2); -WINGDIAPI void APIENTRY glRectiv (const GLint *v1, const GLint *v2); -WINGDIAPI void APIENTRY glRects (GLshort x1, GLshort y1, GLshort x2, GLshort y2); -WINGDIAPI void APIENTRY glRectsv (const GLshort *v1, const GLshort *v2); -WINGDIAPI GLint APIENTRY glRenderMode (GLenum mode); -WINGDIAPI void APIENTRY glRotated (GLdouble angle, GLdouble x, GLdouble y, GLdouble z); -WINGDIAPI void APIENTRY glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z); -WINGDIAPI void APIENTRY glScaled (GLdouble x, GLdouble y, GLdouble z); -WINGDIAPI void APIENTRY glScalef (GLfloat x, GLfloat y, GLfloat z); -WINGDIAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); -WINGDIAPI void APIENTRY glSelectBuffer (GLsizei size, GLuint *buffer); -WINGDIAPI void APIENTRY glShadeModel (GLenum mode); -WINGDIAPI void APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); -WINGDIAPI void APIENTRY glStencilMask (GLuint mask); -WINGDIAPI void APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); -WINGDIAPI void APIENTRY glTexCoord1d (GLdouble s); -WINGDIAPI void APIENTRY glTexCoord1dv (const GLdouble *v); -WINGDIAPI void APIENTRY glTexCoord1f (GLfloat s); -WINGDIAPI void APIENTRY glTexCoord1fv (const GLfloat *v); -WINGDIAPI void APIENTRY glTexCoord1i (GLint s); -WINGDIAPI void APIENTRY glTexCoord1iv (const GLint *v); -WINGDIAPI void APIENTRY glTexCoord1s (GLshort s); -WINGDIAPI void APIENTRY glTexCoord1sv (const GLshort *v); -WINGDIAPI void APIENTRY glTexCoord2d (GLdouble s, GLdouble t); -WINGDIAPI void APIENTRY glTexCoord2dv (const GLdouble *v); -WINGDIAPI void APIENTRY glTexCoord2f (GLfloat s, GLfloat t); -WINGDIAPI void APIENTRY glTexCoord2fv (const GLfloat *v); -WINGDIAPI void APIENTRY glTexCoord2i (GLint s, GLint t); -WINGDIAPI void APIENTRY glTexCoord2iv (const GLint *v); -WINGDIAPI void APIENTRY glTexCoord2s (GLshort s, GLshort t); -WINGDIAPI void APIENTRY glTexCoord2sv (const GLshort *v); -WINGDIAPI void APIENTRY glTexCoord3d (GLdouble s, GLdouble t, GLdouble r); -WINGDIAPI void APIENTRY glTexCoord3dv (const GLdouble *v); -WINGDIAPI void APIENTRY glTexCoord3f (GLfloat s, GLfloat t, GLfloat r); -WINGDIAPI void APIENTRY glTexCoord3fv (const GLfloat *v); -WINGDIAPI void APIENTRY glTexCoord3i (GLint s, GLint t, GLint r); -WINGDIAPI void APIENTRY glTexCoord3iv (const GLint *v); -WINGDIAPI void APIENTRY glTexCoord3s (GLshort s, GLshort t, GLshort r); -WINGDIAPI void APIENTRY glTexCoord3sv (const GLshort *v); -WINGDIAPI void APIENTRY glTexCoord4d (GLdouble s, GLdouble t, GLdouble r, GLdouble q); -WINGDIAPI void APIENTRY glTexCoord4dv (const GLdouble *v); -WINGDIAPI void APIENTRY glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q); -WINGDIAPI void APIENTRY glTexCoord4fv (const GLfloat *v); -WINGDIAPI void APIENTRY glTexCoord4i (GLint s, GLint t, GLint r, GLint q); -WINGDIAPI void APIENTRY glTexCoord4iv (const GLint *v); -WINGDIAPI void APIENTRY glTexCoord4s (GLshort s, GLshort t, GLshort r, GLshort q); -WINGDIAPI void APIENTRY glTexCoord4sv (const GLshort *v); -WINGDIAPI void APIENTRY glTexCoordPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glTexEnvf (GLenum target, GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glTexEnvfv (GLenum target, GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glTexEnvi (GLenum target, GLenum pname, GLint param); -WINGDIAPI void APIENTRY glTexEnviv (GLenum target, GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glTexGend (GLenum coord, GLenum pname, GLdouble param); -WINGDIAPI void APIENTRY glTexGendv (GLenum coord, GLenum pname, const GLdouble *params); -WINGDIAPI void APIENTRY glTexGenf (GLenum coord, GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glTexGeni (GLenum coord, GLenum pname, GLint param); -WINGDIAPI void APIENTRY glTexGeniv (GLenum coord, GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glTexImage1D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -WINGDIAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels); -WINGDIAPI void APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); -WINGDIAPI void APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); -WINGDIAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); -WINGDIAPI void APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); -WINGDIAPI void APIENTRY glTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels); -WINGDIAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); -WINGDIAPI void APIENTRY glTranslated (GLdouble x, GLdouble y, GLdouble z); -WINGDIAPI void APIENTRY glTranslatef (GLfloat x, GLfloat y, GLfloat z); -WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y); -WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v); -WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y); -WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v); -WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y); -WINGDIAPI void APIENTRY glVertex2iv (const GLint *v); -WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y); -WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v); -WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); -WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v); -WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); -WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v); -WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z); -WINGDIAPI void APIENTRY glVertex3iv (const GLint *v); -WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); -WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v); -WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); -WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v); -WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); -WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v); -WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); -WINGDIAPI void APIENTRY glVertex4iv (const GLint *v); -WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); -WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v); -WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); -WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); - -/* EXT_vertex_array */ -typedef void (APIENTRY * PFNGLARRAYELEMENTEXTPROC) (GLint i); -typedef void (APIENTRY * PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); -typedef void (APIENTRY * PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const GLvoid *pointer); -typedef void (APIENTRY * PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); -typedef void (APIENTRY * PFNGLGETPOINTERVEXTPROC) (GLenum pname, GLvoid* *params); -typedef void (APIENTRY * PFNGLARRAYELEMENTARRAYEXTPROC)(GLenum mode, GLsizei count, const GLvoid* pi); - -/* WIN_draw_range_elements */ -typedef void (APIENTRY * PFNGLDRAWRANGEELEMENTSWINPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); - -/* WIN_swap_hint */ -typedef void (APIENTRY * PFNGLADDSWAPHINTRECTWINPROC) (GLint x, GLint y, GLsizei width, GLsizei height); - -/* EXT_paletted_texture */ -typedef void (APIENTRY * PFNGLCOLORTABLEEXTPROC) - (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, - GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLCOLORSUBTABLEEXTPROC) - (GLenum target, GLsizei start, GLsizei count, GLenum format, - GLenum type, const GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOLORTABLEEXTPROC) - (GLenum target, GLenum format, GLenum type, GLvoid *data); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) - (GLenum target, GLenum pname, GLint *params); -typedef void (APIENTRY * PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) - (GLenum target, GLenum pname, GLfloat *params); - -#ifdef __cplusplus -} -#endif - -#endif /* __GL_H__ */ -#endif /* __gl_h_ */ diff --git a/win32/include/GLFW/glfw3.h b/win32/include/GLFW/glfw3.h deleted file mode 100644 index 009fa75..0000000 --- a/win32/include/GLFW/glfw3.h +++ /dev/null @@ -1,3340 +0,0 @@ -/************************************************************************* - * GLFW 3.1 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_h_ -#define _glfw3_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @defgroup context Context handling - * - * This is the reference documentation for context related functions. For more - * information, see the @ref context. - */ -/*! @defgroup init Initialization, version and errors - * - * This is the reference documentation for initialization and termination of - * the library, version management and error handling. For more information, - * see the @ref intro. - */ -/*! @defgroup input Input handling - * - * This is the reference documentation for input related functions and types. - * For more information, see the @ref input. - */ -/*! @defgroup monitor Monitor handling - * - * This is the reference documentation for monitor related functions and types. - * For more information, see the @ref monitor. - */ -/*! @defgroup window Window handling - * - * This is the reference documentation for window related functions and types, - * including creation, deletion and event polling. For more information, see - * the @ref window. - */ - - -/************************************************************************* - * Compiler- and platform-specific preprocessor work - *************************************************************************/ - -/* If we are we on Windows, we want a single define for it. - */ -#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) - #define _WIN32 -#endif /* _WIN32 */ - -/* It is customary to use APIENTRY for OpenGL function pointer declarations on - * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. - */ -#ifndef APIENTRY - #ifdef _WIN32 - #define APIENTRY __stdcall - #else - #define APIENTRY - #endif -#endif /* APIENTRY */ - -/* Some Windows OpenGL headers need this. - */ -#if !defined(WINGDIAPI) && defined(_WIN32) - #define WINGDIAPI __declspec(dllimport) - #define GLFW_WINGDIAPI_DEFINED -#endif /* WINGDIAPI */ - -/* Some Windows GLU headers need this. - */ -#if !defined(CALLBACK) && defined(_WIN32) - #define CALLBACK __stdcall - #define GLFW_CALLBACK_DEFINED -#endif /* CALLBACK */ - -/* Most Windows GLU headers need wchar_t. - * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. - */ -#if !defined(GLFW_INCLUDE_NONE) - #include -#endif - -/* Include the chosen client API headers. - */ -#if defined(__APPLE_CC__) - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif !defined(GLFW_INCLUDE_NONE) - #if !defined(GLFW_INCLUDE_GLEXT) - #define GL_GLEXT_LEGACY - #endif - #include - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#else - #if defined(GLFW_INCLUDE_GLCOREARB) - #include - #elif defined(GLFW_INCLUDE_ES1) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES2) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES3) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif defined(GLFW_INCLUDE_ES31) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #elif !defined(GLFW_INCLUDE_NONE) - #include - #if defined(GLFW_INCLUDE_GLEXT) - #include - #endif - #endif - #if defined(GLFW_INCLUDE_GLU) - #include - #endif -#endif - -#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) - /* GLFW_DLL must be defined by applications that are linking against the DLL - * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW - * configuration header when compiling the DLL version of the library. - */ - #error "You may not have both GLFW_DLL and _GLFW_BUILD_DLL defined" -#endif - -/* GLFWAPI is used to declare public API functions for export - * from the DLL / shared library / dynamic library. - */ -#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllexport) -#elif defined(_WIN32) && defined(GLFW_DLL) - /* We are calling GLFW as a Win32 DLL */ - #define GLFWAPI __declspec(dllimport) -#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) - /* We are building GLFW as a shared / dynamic library */ - #define GLFWAPI __attribute__((visibility("default"))) -#else - /* We are building or calling GLFW as a static library */ - #define GLFWAPI -#endif - - -/************************************************************************* - * GLFW API tokens - *************************************************************************/ - -/*! @name GLFW version macros - * @{ */ -/*! @brief The major version number of the GLFW library. - * - * This is incremented when the API is changed in non-compatible ways. - * @ingroup init - */ -#define GLFW_VERSION_MAJOR 3 -/*! @brief The minor version number of the GLFW library. - * - * This is incremented when features are added to the API but it remains - * backward-compatible. - * @ingroup init - */ -#define GLFW_VERSION_MINOR 1 -/*! @brief The revision number of the GLFW library. - * - * This is incremented when a bug fix release is made that does not contain any - * API changes. - * @ingroup init - */ -#define GLFW_VERSION_REVISION 1 -/*! @} */ - -/*! @name Key and button actions - * @{ */ -/*! @brief The key or mouse button was released. - * - * The key or mouse button was released. - * - * @ingroup input - */ -#define GLFW_RELEASE 0 -/*! @brief The key or mouse button was pressed. - * - * The key or mouse button was pressed. - * - * @ingroup input - */ -#define GLFW_PRESS 1 -/*! @brief The key was held down until it repeated. - * - * The key was held down until it repeated. - * - * @ingroup input - */ -#define GLFW_REPEAT 2 -/*! @} */ - -/*! @defgroup keys Keyboard keys - * - * See [key input](@ref input_key) for how these are used. - * - * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), - * but re-arranged to map to 7-bit ASCII for printable keys (function keys are - * put in the 256+ range). - * - * The naming of the key codes follow these rules: - * - The US keyboard layout is used - * - Names of printable alpha-numeric characters are used (e.g. "A", "R", - * "3", etc.) - * - For non-alphanumeric characters, Unicode:ish names are used (e.g. - * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not - * correspond to the Unicode standard (usually for brevity) - * - Keys that lack a clear US mapping are named "WORLD_x" - * - For non-printable keys, custom names are used (e.g. "F4", - * "BACKSPACE", etc.) - * - * @ingroup input - * @{ - */ - -/* The unknown key */ -#define GLFW_KEY_UNKNOWN -1 - -/* Printable keys */ -#define GLFW_KEY_SPACE 32 -#define GLFW_KEY_APOSTROPHE 39 /* ' */ -#define GLFW_KEY_COMMA 44 /* , */ -#define GLFW_KEY_MINUS 45 /* - */ -#define GLFW_KEY_PERIOD 46 /* . */ -#define GLFW_KEY_SLASH 47 /* / */ -#define GLFW_KEY_0 48 -#define GLFW_KEY_1 49 -#define GLFW_KEY_2 50 -#define GLFW_KEY_3 51 -#define GLFW_KEY_4 52 -#define GLFW_KEY_5 53 -#define GLFW_KEY_6 54 -#define GLFW_KEY_7 55 -#define GLFW_KEY_8 56 -#define GLFW_KEY_9 57 -#define GLFW_KEY_SEMICOLON 59 /* ; */ -#define GLFW_KEY_EQUAL 61 /* = */ -#define GLFW_KEY_A 65 -#define GLFW_KEY_B 66 -#define GLFW_KEY_C 67 -#define GLFW_KEY_D 68 -#define GLFW_KEY_E 69 -#define GLFW_KEY_F 70 -#define GLFW_KEY_G 71 -#define GLFW_KEY_H 72 -#define GLFW_KEY_I 73 -#define GLFW_KEY_J 74 -#define GLFW_KEY_K 75 -#define GLFW_KEY_L 76 -#define GLFW_KEY_M 77 -#define GLFW_KEY_N 78 -#define GLFW_KEY_O 79 -#define GLFW_KEY_P 80 -#define GLFW_KEY_Q 81 -#define GLFW_KEY_R 82 -#define GLFW_KEY_S 83 -#define GLFW_KEY_T 84 -#define GLFW_KEY_U 85 -#define GLFW_KEY_V 86 -#define GLFW_KEY_W 87 -#define GLFW_KEY_X 88 -#define GLFW_KEY_Y 89 -#define GLFW_KEY_Z 90 -#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ -#define GLFW_KEY_BACKSLASH 92 /* \ */ -#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ -#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ -#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ -#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ - -/* Function keys */ -#define GLFW_KEY_ESCAPE 256 -#define GLFW_KEY_ENTER 257 -#define GLFW_KEY_TAB 258 -#define GLFW_KEY_BACKSPACE 259 -#define GLFW_KEY_INSERT 260 -#define GLFW_KEY_DELETE 261 -#define GLFW_KEY_RIGHT 262 -#define GLFW_KEY_LEFT 263 -#define GLFW_KEY_DOWN 264 -#define GLFW_KEY_UP 265 -#define GLFW_KEY_PAGE_UP 266 -#define GLFW_KEY_PAGE_DOWN 267 -#define GLFW_KEY_HOME 268 -#define GLFW_KEY_END 269 -#define GLFW_KEY_CAPS_LOCK 280 -#define GLFW_KEY_SCROLL_LOCK 281 -#define GLFW_KEY_NUM_LOCK 282 -#define GLFW_KEY_PRINT_SCREEN 283 -#define GLFW_KEY_PAUSE 284 -#define GLFW_KEY_F1 290 -#define GLFW_KEY_F2 291 -#define GLFW_KEY_F3 292 -#define GLFW_KEY_F4 293 -#define GLFW_KEY_F5 294 -#define GLFW_KEY_F6 295 -#define GLFW_KEY_F7 296 -#define GLFW_KEY_F8 297 -#define GLFW_KEY_F9 298 -#define GLFW_KEY_F10 299 -#define GLFW_KEY_F11 300 -#define GLFW_KEY_F12 301 -#define GLFW_KEY_F13 302 -#define GLFW_KEY_F14 303 -#define GLFW_KEY_F15 304 -#define GLFW_KEY_F16 305 -#define GLFW_KEY_F17 306 -#define GLFW_KEY_F18 307 -#define GLFW_KEY_F19 308 -#define GLFW_KEY_F20 309 -#define GLFW_KEY_F21 310 -#define GLFW_KEY_F22 311 -#define GLFW_KEY_F23 312 -#define GLFW_KEY_F24 313 -#define GLFW_KEY_F25 314 -#define GLFW_KEY_KP_0 320 -#define GLFW_KEY_KP_1 321 -#define GLFW_KEY_KP_2 322 -#define GLFW_KEY_KP_3 323 -#define GLFW_KEY_KP_4 324 -#define GLFW_KEY_KP_5 325 -#define GLFW_KEY_KP_6 326 -#define GLFW_KEY_KP_7 327 -#define GLFW_KEY_KP_8 328 -#define GLFW_KEY_KP_9 329 -#define GLFW_KEY_KP_DECIMAL 330 -#define GLFW_KEY_KP_DIVIDE 331 -#define GLFW_KEY_KP_MULTIPLY 332 -#define GLFW_KEY_KP_SUBTRACT 333 -#define GLFW_KEY_KP_ADD 334 -#define GLFW_KEY_KP_ENTER 335 -#define GLFW_KEY_KP_EQUAL 336 -#define GLFW_KEY_LEFT_SHIFT 340 -#define GLFW_KEY_LEFT_CONTROL 341 -#define GLFW_KEY_LEFT_ALT 342 -#define GLFW_KEY_LEFT_SUPER 343 -#define GLFW_KEY_RIGHT_SHIFT 344 -#define GLFW_KEY_RIGHT_CONTROL 345 -#define GLFW_KEY_RIGHT_ALT 346 -#define GLFW_KEY_RIGHT_SUPER 347 -#define GLFW_KEY_MENU 348 -#define GLFW_KEY_LAST GLFW_KEY_MENU - -/*! @} */ - -/*! @defgroup mods Modifier key flags - * - * See [key input](@ref input_key) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief If this bit is set one or more Shift keys were held down. - */ -#define GLFW_MOD_SHIFT 0x0001 -/*! @brief If this bit is set one or more Control keys were held down. - */ -#define GLFW_MOD_CONTROL 0x0002 -/*! @brief If this bit is set one or more Alt keys were held down. - */ -#define GLFW_MOD_ALT 0x0004 -/*! @brief If this bit is set one or more Super keys were held down. - */ -#define GLFW_MOD_SUPER 0x0008 - -/*! @} */ - -/*! @defgroup buttons Mouse buttons - * - * See [mouse button input](@ref input_mouse_button) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_MOUSE_BUTTON_1 0 -#define GLFW_MOUSE_BUTTON_2 1 -#define GLFW_MOUSE_BUTTON_3 2 -#define GLFW_MOUSE_BUTTON_4 3 -#define GLFW_MOUSE_BUTTON_5 4 -#define GLFW_MOUSE_BUTTON_6 5 -#define GLFW_MOUSE_BUTTON_7 6 -#define GLFW_MOUSE_BUTTON_8 7 -#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 -#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 -#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 -#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 -/*! @} */ - -/*! @defgroup joysticks Joysticks - * - * See [joystick input](@ref joystick) for how these are used. - * - * @ingroup input - * @{ */ -#define GLFW_JOYSTICK_1 0 -#define GLFW_JOYSTICK_2 1 -#define GLFW_JOYSTICK_3 2 -#define GLFW_JOYSTICK_4 3 -#define GLFW_JOYSTICK_5 4 -#define GLFW_JOYSTICK_6 5 -#define GLFW_JOYSTICK_7 6 -#define GLFW_JOYSTICK_8 7 -#define GLFW_JOYSTICK_9 8 -#define GLFW_JOYSTICK_10 9 -#define GLFW_JOYSTICK_11 10 -#define GLFW_JOYSTICK_12 11 -#define GLFW_JOYSTICK_13 12 -#define GLFW_JOYSTICK_14 13 -#define GLFW_JOYSTICK_15 14 -#define GLFW_JOYSTICK_16 15 -#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 -/*! @} */ - -/*! @defgroup errors Error codes - * - * See [error handling](@ref error_handling) for how these are used. - * - * @ingroup init - * @{ */ -/*! @brief GLFW has not been initialized. - * - * This occurs if a GLFW function was called that may not be called unless the - * library is [initialized](@ref intro_init). - * - * @par Analysis - * Application programmer error. Initialize GLFW before calling any function - * that requires initialization. - */ -#define GLFW_NOT_INITIALIZED 0x00010001 -/*! @brief No context is current for this thread. - * - * This occurs if a GLFW function was called that needs and operates on the - * current OpenGL or OpenGL ES context but no context is current on the calling - * thread. One such function is @ref glfwSwapInterval. - * - * @par Analysis - * Application programmer error. Ensure a context is current before calling - * functions that require a current context. - */ -#define GLFW_NO_CURRENT_CONTEXT 0x00010002 -/*! @brief One of the arguments to the function was an invalid enum value. - * - * One of the arguments to the function was an invalid enum value, for example - * requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref - * glfwGetWindowAttrib. - * - * @par Analysis - * Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_ENUM 0x00010003 -/*! @brief One of the arguments to the function was an invalid value. - * - * One of the arguments to the function was an invalid value, for example - * requesting a non-existent OpenGL or OpenGL ES version like 2.7. - * - * Requesting a valid but unavailable OpenGL or OpenGL ES version will instead - * result in a @ref GLFW_VERSION_UNAVAILABLE error. - * - * @par Analysis - * Application programmer error. Fix the offending call. - */ -#define GLFW_INVALID_VALUE 0x00010004 -/*! @brief A memory allocation failed. - * - * A memory allocation failed. - * - * @par Analysis - * A bug in GLFW or the underlying operating system. Report the bug to our - * [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_OUT_OF_MEMORY 0x00010005 -/*! @brief GLFW could not find support for the requested client API on the - * system. - * - * GLFW could not find support for the requested client API on the system. If - * emitted by functions other than @ref glfwCreateWindow, no supported client - * API was found. - * - * @par Analysis - * The installed graphics driver does not support the requested client API, or - * does not support it via the chosen context creation backend. Below are - * a few examples. - * - * @par - * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only - * supports OpenGL ES via EGL, while Nvidia and Intel only supports it via - * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa - * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary - * driver. - */ -#define GLFW_API_UNAVAILABLE 0x00010006 -/*! @brief The requested OpenGL or OpenGL ES version is not available. - * - * The requested OpenGL or OpenGL ES version (including any requested context - * or framebuffer hints) is not available on this machine. - * - * @par Analysis - * The machine does not support your requirements. If your application is - * sufficiently flexible, downgrade your requirements and try again. - * Otherwise, inform the user that their machine does not match your - * requirements. - * - * @par - * Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 - * comes out before the 4.x series gets that far, also fail with this error and - * not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions - * will exist. - */ -#define GLFW_VERSION_UNAVAILABLE 0x00010007 -/*! @brief A platform-specific error occurred that does not match any of the - * more specific categories. - * - * A platform-specific error occurred that does not match any of the more - * specific categories. - * - * @par Analysis - * A bug or configuration error in GLFW, the underlying operating system or - * its drivers, or a lack of required resources. Report the issue to our - * [issue tracker](https://github.com/glfw/glfw/issues). - */ -#define GLFW_PLATFORM_ERROR 0x00010008 -/*! @brief The requested format is not supported or available. - * - * If emitted during window creation, the requested pixel format is not - * supported. - * - * If emitted when querying the clipboard, the contents of the clipboard could - * not be converted to the requested format. - * - * @par Analysis - * If emitted during window creation, one or more - * [hard constraints](@ref window_hints_hard) did not match any of the - * available pixel formats. If your application is sufficiently flexible, - * downgrade your requirements and try again. Otherwise, inform the user that - * their machine does not match your requirements. - * - * @par - * If emitted when querying the clipboard, ignore the error or report it to - * the user, as appropriate. - */ -#define GLFW_FORMAT_UNAVAILABLE 0x00010009 -/*! @} */ - -#define GLFW_FOCUSED 0x00020001 -#define GLFW_ICONIFIED 0x00020002 -#define GLFW_RESIZABLE 0x00020003 -#define GLFW_VISIBLE 0x00020004 -#define GLFW_DECORATED 0x00020005 -#define GLFW_AUTO_ICONIFY 0x00020006 -#define GLFW_FLOATING 0x00020007 - -#define GLFW_RED_BITS 0x00021001 -#define GLFW_GREEN_BITS 0x00021002 -#define GLFW_BLUE_BITS 0x00021003 -#define GLFW_ALPHA_BITS 0x00021004 -#define GLFW_DEPTH_BITS 0x00021005 -#define GLFW_STENCIL_BITS 0x00021006 -#define GLFW_ACCUM_RED_BITS 0x00021007 -#define GLFW_ACCUM_GREEN_BITS 0x00021008 -#define GLFW_ACCUM_BLUE_BITS 0x00021009 -#define GLFW_ACCUM_ALPHA_BITS 0x0002100A -#define GLFW_AUX_BUFFERS 0x0002100B -#define GLFW_STEREO 0x0002100C -#define GLFW_SAMPLES 0x0002100D -#define GLFW_SRGB_CAPABLE 0x0002100E -#define GLFW_REFRESH_RATE 0x0002100F -#define GLFW_DOUBLEBUFFER 0x00021010 - -#define GLFW_CLIENT_API 0x00022001 -#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 -#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 -#define GLFW_CONTEXT_REVISION 0x00022004 -#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 -#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 -#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 -#define GLFW_OPENGL_PROFILE 0x00022008 -#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 - -#define GLFW_OPENGL_API 0x00030001 -#define GLFW_OPENGL_ES_API 0x00030002 - -#define GLFW_NO_ROBUSTNESS 0 -#define GLFW_NO_RESET_NOTIFICATION 0x00031001 -#define GLFW_LOSE_CONTEXT_ON_RESET 0x00031002 - -#define GLFW_OPENGL_ANY_PROFILE 0 -#define GLFW_OPENGL_CORE_PROFILE 0x00032001 -#define GLFW_OPENGL_COMPAT_PROFILE 0x00032002 - -#define GLFW_CURSOR 0x00033001 -#define GLFW_STICKY_KEYS 0x00033002 -#define GLFW_STICKY_MOUSE_BUTTONS 0x00033003 - -#define GLFW_CURSOR_NORMAL 0x00034001 -#define GLFW_CURSOR_HIDDEN 0x00034002 -#define GLFW_CURSOR_DISABLED 0x00034003 - -#define GLFW_ANY_RELEASE_BEHAVIOR 0 -#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 -#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 - -/*! @defgroup shapes Standard cursor shapes - * - * See [standard cursor creation](@ref cursor_standard) for how these are used. - * - * @ingroup input - * @{ */ - -/*! @brief The regular arrow cursor shape. - * - * The regular arrow cursor. - */ -#define GLFW_ARROW_CURSOR 0x00036001 -/*! @brief The text input I-beam cursor shape. - * - * The text input I-beam cursor shape. - */ -#define GLFW_IBEAM_CURSOR 0x00036002 -/*! @brief The crosshair shape. - * - * The crosshair shape. - */ -#define GLFW_CROSSHAIR_CURSOR 0x00036003 -/*! @brief The hand shape. - * - * The hand shape. - */ -#define GLFW_HAND_CURSOR 0x00036004 -/*! @brief The horizontal resize arrow shape. - * - * The horizontal resize arrow shape. - */ -#define GLFW_HRESIZE_CURSOR 0x00036005 -/*! @brief The vertical resize arrow shape. - * - * The vertical resize arrow shape. - */ -#define GLFW_VRESIZE_CURSOR 0x00036006 -/*! @} */ - -#define GLFW_CONNECTED 0x00040001 -#define GLFW_DISCONNECTED 0x00040002 - -#define GLFW_DONT_CARE -1 - - -/************************************************************************* - * GLFW API types - *************************************************************************/ - -/*! @brief Client API function pointer type. - * - * Generic function pointer used for returning client API function pointers - * without forcing a cast from a regular pointer. - * - * @ingroup context - */ -typedef void (*GLFWglproc)(void); - -/*! @brief Opaque monitor object. - * - * Opaque monitor object. - * - * @ingroup monitor - */ -typedef struct GLFWmonitor GLFWmonitor; - -/*! @brief Opaque window object. - * - * Opaque window object. - * - * @ingroup window - */ -typedef struct GLFWwindow GLFWwindow; - -/*! @brief Opaque cursor object. - * - * Opaque cursor object. - * - * @ingroup cursor - */ -typedef struct GLFWcursor GLFWcursor; - -/*! @brief The function signature for error callbacks. - * - * This is the function signature for error callback functions. - * - * @param[in] error An [error code](@ref errors). - * @param[in] description A UTF-8 encoded string describing the error. - * - * @sa glfwSetErrorCallback - * - * @ingroup init - */ -typedef void (* GLFWerrorfun)(int,const char*); - -/*! @brief The function signature for window position callbacks. - * - * This is the function signature for window position callback functions. - * - * @param[in] window The window that was moved. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the - * upper-left corner of the client area of the window. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the - * upper-left corner of the client area of the window. - * - * @sa glfwSetWindowPosCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window resize callbacks. - * - * This is the function signature for window size callback functions. - * - * @param[in] window The window that was resized. - * @param[in] width The new width, in screen coordinates, of the window. - * @param[in] height The new height, in screen coordinates, of the window. - * - * @sa glfwSetWindowSizeCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for window close callbacks. - * - * This is the function signature for window close callback functions. - * - * @param[in] window The window that the user attempted to close. - * - * @sa glfwSetWindowCloseCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowclosefun)(GLFWwindow*); - -/*! @brief The function signature for window content refresh callbacks. - * - * This is the function signature for window refresh callback functions. - * - * @param[in] window The window whose content needs to be refreshed. - * - * @sa glfwSetWindowRefreshCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); - -/*! @brief The function signature for window focus/defocus callbacks. - * - * This is the function signature for window focus callback functions. - * - * @param[in] window The window that gained or lost input focus. - * @param[in] focused `GL_TRUE` if the window was given input focus, or - * `GL_FALSE` if it lost it. - * - * @sa glfwSetWindowFocusCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); - -/*! @brief The function signature for window iconify/restore callbacks. - * - * This is the function signature for window iconify/restore callback - * functions. - * - * @param[in] window The window that was iconified or restored. - * @param[in] iconified `GL_TRUE` if the window was iconified, or `GL_FALSE` - * if it was restored. - * - * @sa glfwSetWindowIconifyCallback - * - * @ingroup window - */ -typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); - -/*! @brief The function signature for framebuffer resize callbacks. - * - * This is the function signature for framebuffer resize callback - * functions. - * - * @param[in] window The window whose framebuffer was resized. - * @param[in] width The new width, in pixels, of the framebuffer. - * @param[in] height The new height, in pixels, of the framebuffer. - * - * @sa glfwSetFramebufferSizeCallback - * - * @ingroup window - */ -typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); - -/*! @brief The function signature for mouse button callbacks. - * - * This is the function signature for mouse button callback functions. - * - * @param[in] window The window that received the event. - * @param[in] button The [mouse button](@ref buttons) that was pressed or - * released. - * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa glfwSetMouseButtonCallback - * - * @ingroup input - */ -typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); - -/*! @brief The function signature for cursor position callbacks. - * - * This is the function signature for cursor position callback functions. - * - * @param[in] window The window that received the event. - * @param[in] xpos The new x-coordinate, in screen coordinates, of the cursor. - * @param[in] ypos The new y-coordinate, in screen coordinates, of the cursor. - * - * @sa glfwSetCursorPosCallback - * - * @ingroup input - */ -typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for cursor enter/leave callbacks. - * - * This is the function signature for cursor enter/leave callback functions. - * - * @param[in] window The window that received the event. - * @param[in] entered `GL_TRUE` if the cursor entered the window's client - * area, or `GL_FALSE` if it left it. - * - * @sa glfwSetCursorEnterCallback - * - * @ingroup input - */ -typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); - -/*! @brief The function signature for scroll callbacks. - * - * This is the function signature for scroll callback functions. - * - * @param[in] window The window that received the event. - * @param[in] xoffset The scroll offset along the x-axis. - * @param[in] yoffset The scroll offset along the y-axis. - * - * @sa glfwSetScrollCallback - * - * @ingroup input - */ -typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); - -/*! @brief The function signature for keyboard key callbacks. - * - * This is the function signature for keyboard key callback functions. - * - * @param[in] window The window that received the event. - * @param[in] key The [keyboard key](@ref keys) that was pressed or released. - * @param[in] scancode The system-specific scancode of the key. - * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa glfwSetKeyCallback - * - * @ingroup input - */ -typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); - -/*! @brief The function signature for Unicode character callbacks. - * - * This is the function signature for Unicode character callback functions. - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * - * @sa glfwSetCharCallback - * - * @ingroup input - */ -typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); - -/*! @brief The function signature for Unicode character with modifiers - * callbacks. - * - * This is the function signature for Unicode character with modifiers callback - * functions. It is called for each input character, regardless of what - * modifier keys are held down. - * - * @param[in] window The window that received the event. - * @param[in] codepoint The Unicode code point of the character. - * @param[in] mods Bit field describing which [modifier keys](@ref mods) were - * held down. - * - * @sa glfwSetCharModsCallback - * - * @ingroup input - */ -typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); - -/*! @brief The function signature for file drop callbacks. - * - * This is the function signature for file drop callbacks. - * - * @param[in] window The window that received the event. - * @param[in] count The number of dropped files. - * @param[in] paths The UTF-8 encoded file and/or directory path names. - * - * @sa glfwSetDropCallback - * - * @ingroup input - */ -typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); - -/*! @brief The function signature for monitor configuration callbacks. - * - * This is the function signature for monitor configuration callback functions. - * - * @param[in] monitor The monitor that was connected or disconnected. - * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. - * - * @sa glfwSetMonitorCallback - * - * @ingroup monitor - */ -typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); - -/*! @brief Video mode type. - * - * This describes a single video mode. - * - * @ingroup monitor - */ -typedef struct GLFWvidmode -{ - /*! The width, in screen coordinates, of the video mode. - */ - int width; - /*! The height, in screen coordinates, of the video mode. - */ - int height; - /*! The bit depth of the red channel of the video mode. - */ - int redBits; - /*! The bit depth of the green channel of the video mode. - */ - int greenBits; - /*! The bit depth of the blue channel of the video mode. - */ - int blueBits; - /*! The refresh rate, in Hz, of the video mode. - */ - int refreshRate; -} GLFWvidmode; - -/*! @brief Gamma ramp. - * - * This describes the gamma ramp for a monitor. - * - * @sa glfwGetGammaRamp glfwSetGammaRamp - * - * @ingroup monitor - */ -typedef struct GLFWgammaramp -{ - /*! An array of value describing the response of the red channel. - */ - unsigned short* red; - /*! An array of value describing the response of the green channel. - */ - unsigned short* green; - /*! An array of value describing the response of the blue channel. - */ - unsigned short* blue; - /*! The number of elements in each array. - */ - unsigned int size; -} GLFWgammaramp; - -/*! @brief Image data. - */ -typedef struct GLFWimage -{ - /*! The width, in pixels, of this image. - */ - int width; - /*! The height, in pixels, of this image. - */ - int height; - /*! The pixel data of this image, arranged left-to-right, top-to-bottom. - */ - unsigned char* pixels; -} GLFWimage; - - -/************************************************************************* - * GLFW API functions - *************************************************************************/ - -/*! @brief Initializes the GLFW library. - * - * This function initializes the GLFW library. Before most GLFW functions can - * be used, GLFW must be initialized, and before an application terminates GLFW - * should be terminated in order to free any resources allocated during or - * after initialization. - * - * If this function fails, it calls @ref glfwTerminate before returning. If it - * succeeds, you should call @ref glfwTerminate before the application exits. - * - * Additional calls to this function after successful initialization but before - * termination will return `GL_TRUE` immediately. - * - * @return `GL_TRUE` if successful, or `GL_FALSE` if an - * [error](@ref error_handling) occurred. - * - * @remarks __OS X:__ This function will change the current directory of the - * application to the `Contents/Resources` subdirectory of the application's - * bundle, if present. This can be disabled with a - * [compile-time option](@ref compile_options_osx). - * - * @remarks __X11:__ If the `LC_CTYPE` category of the current locale is set to - * `"C"` then the environment's locale will be applied to that category. This - * is done because character input will not function when `LC_CTYPE` is set to - * `"C"`. If another locale was set before this function was called, it will - * be left untouched. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref intro_init - * @sa glfwTerminate - * - * @since Added in GLFW 1.0. - * - * @ingroup init - */ -GLFWAPI int glfwInit(void); - -/*! @brief Terminates the GLFW library. - * - * This function destroys all remaining windows and cursors, restores any - * modified gamma ramps and frees any other allocated resources. Once this - * function is called, you must again call @ref glfwInit successfully before - * you will be able to use most GLFW functions. - * - * If GLFW has been successfully initialized, this function should be called - * before the application exits. If initialization fails, there is no need to - * call this function, as it is called by @ref glfwInit before it returns - * failure. - * - * @remarks This function may be called before @ref glfwInit. - * - * @warning No window's context may be current on another thread when this - * function is called. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref intro_init - * @sa glfwInit - * - * @since Added in GLFW 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwTerminate(void); - -/*! @brief Retrieves the version of the GLFW library. - * - * This function retrieves the major, minor and revision numbers of the GLFW - * library. It is intended for when you are using GLFW as a shared library and - * want to ensure that you are using the minimum required version. - * - * Any or all of the version arguments may be `NULL`. This function always - * succeeds. - * - * @param[out] major Where to store the major version number, or `NULL`. - * @param[out] minor Where to store the minor version number, or `NULL`. - * @param[out] rev Where to store the revision number, or `NULL`. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref intro_version - * @sa glfwGetVersionString - * - * @since Added in GLFW 1.0. - * - * @ingroup init - */ -GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); - -/*! @brief Returns a string describing the compile-time configuration. - * - * This function returns the compile-time generated - * [version string](@ref intro_version_string) of the GLFW library binary. It - * describes the version, platform, compiler and any platform-specific - * compile-time options. - * - * __Do not use the version string__ to parse the GLFW library version. The - * @ref glfwGetVersion function already provides the version of the running - * library binary. - * - * This function always succeeds. - * - * @return The GLFW version string. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Pointer Lifetime - * The returned string is static and compile-time generated. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref intro_version - * @sa glfwGetVersion - * - * @since Added in GLFW 3.0. - * - * @ingroup init - */ -GLFWAPI const char* glfwGetVersionString(void); - -/*! @brief Sets the error callback. - * - * This function sets the error callback, which is called with an error code - * and a human-readable description each time a GLFW error occurs. - * - * The error callback is called on the thread where the error occurred. If you - * are using GLFW from multiple threads, your error callback needs to be - * written accordingly. - * - * Because the description string may have been generated specifically for that - * error, it is not guaranteed to be valid after the callback has returned. If - * you wish to use it after the callback returns, you need to make a copy. - * - * Once set, the error callback remains set even after the library has been - * terminated. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set. - * - * @remarks This function may be called before @ref glfwInit. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref error_handling - * - * @since Added in GLFW 3.0. - * - * @ingroup init - */ -GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); - -/*! @brief Returns the currently connected monitors. - * - * This function returns an array of handles for all currently connected - * monitors. - * - * @param[out] count Where to store the number of monitors in the returned - * array. This is set to zero if an error occurred. - * @return An array of monitor handles, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned array is allocated and freed by GLFW. You should not free it - * yourself. It is guaranteed to be valid only until the monitor configuration - * changes or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa @ref monitor_event - * @sa glfwGetPrimaryMonitor - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); - -/*! @brief Returns the primary monitor. - * - * This function returns the primary monitor. This is usually the monitor - * where elements like the Windows task bar or the OS X menu bar is located. - * - * @return The primary monitor, or `NULL` if an [error](@ref error_handling) - * occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_monitors - * @sa glfwGetMonitors - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); - -/*! @brief Returns the position of the monitor's viewport on the virtual screen. - * - * This function returns the position, in screen coordinates, of the upper-left - * corner of the specified monitor. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. - * @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); - -/*! @brief Returns the physical size of the monitor. - * - * This function returns the size, in millimetres, of the display area of the - * specified monitor. - * - * Some systems do not provide accurate monitor size information, either - * because the monitor - * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) - * data is incorrect or because the driver does not report it accurately. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] monitor The monitor to query. - * @param[out] widthMM Where to store the width, in millimetres, of the - * monitor's display area, or `NULL`. - * @param[out] heightMM Where to store the height, in millimetres, of the - * monitor's display area, or `NULL`. - * - * @remarks __Windows:__ The OS calculates the returned physical size from the - * current resolution and system DPI instead of querying the monitor EDID data. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); - -/*! @brief Returns the name of the specified monitor. - * - * This function returns a human-readable name, encoded as UTF-8, of the - * specified monitor. The name typically reflects the make and model of the - * monitor and is not guaranteed to be unique among the connected monitors. - * - * @param[in] monitor The monitor to query. - * @return The UTF-8 encoded name of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified monitor is disconnected or the - * library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_properties - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); - -/*! @brief Sets the monitor configuration callback. - * - * This function sets the monitor configuration callback, or removes the - * currently set callback. This is called when a monitor is connected to or - * disconnected from the system. - * - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @bug __X11:__ This callback is not yet called on monitor configuration - * changes. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_event - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); - -/*! @brief Returns the available video modes for the specified monitor. - * - * This function returns an array of all video modes supported by the specified - * monitor. The returned array is sorted in ascending order, first by color - * bit depth (the sum of all channel depths) and then by resolution area (the - * product of width and height). - * - * @param[in] monitor The monitor to query. - * @param[out] count Where to store the number of video modes in the returned - * array. This is set to zero if an error occurred. - * @return An array of video modes, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned array is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified monitor is disconnected, this - * function is called again for that monitor or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa glfwGetVideoMode - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Changed to return an array of modes for a specific monitor. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); - -/*! @brief Returns the current mode of the specified monitor. - * - * This function returns the current video mode of the specified monitor. If - * you have created a full screen window for that monitor, the return value - * will depend on whether that window is iconified. - * - * @param[in] monitor The monitor to query. - * @return The current mode of the monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned array is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified monitor is disconnected or the - * library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_modes - * @sa glfwGetVideoModes - * - * @since Added in GLFW 3.0. Replaces `glfwGetDesktopMode`. - * - * @ingroup monitor - */ -GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); - -/*! @brief Generates a gamma ramp and sets it for the specified monitor. - * - * This function generates a 256-element gamma ramp from the specified exponent - * and then calls @ref glfwSetGammaRamp with it. The value must be a finite - * number greater than zero. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] gamma The desired exponent. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); - -/*! @brief Returns the current gamma ramp for the specified monitor. - * - * This function returns the current gamma ramp of the specified monitor. - * - * @param[in] monitor The monitor to query. - * @return The current gamma ramp, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned structure and its arrays are allocated and freed by GLFW. You - * should not free them yourself. They are valid until the specified monitor - * is disconnected, this function is called again for that monitor or the - * library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); - -/*! @brief Sets the current gamma ramp for the specified monitor. - * - * This function sets the current gamma ramp for the specified monitor. The - * original gamma ramp for that monitor is saved by GLFW the first time this - * function is called and is restored by @ref glfwTerminate. - * - * @param[in] monitor The monitor whose gamma ramp to set. - * @param[in] ramp The gamma ramp to use. - * - * @remarks Gamma ramp sizes other than 256 are not supported by all platforms - * or graphics hardware. - * - * @remarks __Windows:__ The gamma ramp size must be 256. - * - * @par Pointer Lifetime - * The specified gamma ramp is copied before this function returns. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref monitor_gamma - * - * @since Added in GLFW 3.0. - * - * @ingroup monitor - */ -GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); - -/*! @brief Resets all window hints to their default values. - * - * This function resets all window hints to their - * [default values](@ref window_hints_values). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hints - * @sa glfwWindowHint - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwDefaultWindowHints(void); - -/*! @brief Sets the specified window hint to the desired value. - * - * This function sets hints for the next call to @ref glfwCreateWindow. The - * hints, once set, retain their values until changed by a call to @ref - * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is - * terminated. - * - * @param[in] target The [window hint](@ref window_hints) to set. - * @param[in] hint The new value of the window hint. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hints - * @sa glfwDefaultWindowHints - * - * @since Added in GLFW 3.0. Replaces `glfwOpenWindowHint`. - * - * @ingroup window - */ -GLFWAPI void glfwWindowHint(int target, int hint); - -/*! @brief Creates a window and its associated context. - * - * This function creates a window and its associated OpenGL or OpenGL ES - * context. Most of the options controlling how the window and its context - * should be created are specified with [window hints](@ref window_hints). - * - * Successful creation does not change which context is current. Before you - * can use the newly created context, you need to - * [make it current](@ref context_current). For information about the `share` - * parameter, see @ref context_sharing. - * - * The created window, framebuffer and context may differ from what you - * requested, as not all parameters and hints are - * [hard constraints](@ref window_hints_hard). This includes the size of the - * window, especially for full screen windows. To query the actual attributes - * of the created window, framebuffer and context, use queries like @ref - * glfwGetWindowAttrib and @ref glfwGetWindowSize. - * - * To create a full screen window, you need to specify the monitor the window - * will cover. If no monitor is specified, windowed mode will be used. Unless - * you have a way for the user to choose a specific monitor, it is recommended - * that you pick the primary monitor. For more information on how to query - * connected monitors, see @ref monitor_monitors. - * - * For full screen windows, the specified size becomes the resolution of the - * window's _desired video mode_. As long as a full screen window has input - * focus, the supported video mode most closely matching the desired video mode - * is set for the specified monitor. For more information about full screen - * windows, including the creation of so called _windowed full screen_ or - * _borderless full screen_ windows, see @ref window_windowed_full_screen. - * - * By default, newly created windows use the placement recommended by the - * window system. To create the window at a specific position, make it - * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window - * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) - * it. - * - * If a full screen window has input focus, the screensaver is prohibited from - * starting. - * - * Window systems put limits on window sizes. Very large or very small window - * dimensions may be overridden by the window system on creation. Check the - * actual [size](@ref window_size) after creation. - * - * The [swap interval](@ref buffer_swap) is not set during window creation and - * the initial value may vary depending on driver settings and defaults. - * - * @param[in] width The desired width, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] height The desired height, in screen coordinates, of the window. - * This must be greater than zero. - * @param[in] title The initial, UTF-8 encoded window title. - * @param[in] monitor The monitor to use for full screen mode, or `NULL` to use - * windowed mode. - * @param[in] share The window whose context to share resources with, or `NULL` - * to not share resources. - * @return The handle of the created window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @remarks __Windows:__ Window creation will fail if the Microsoft GDI - * software OpenGL implementation is the only one available. - * - * @remarks __Windows:__ If the executable has an icon resource named - * `GLFW_ICON,` it will be set as the icon for the window. If no such icon is - * present, the `IDI_WINLOGO` icon will be used instead. - * - * @remarks __Windows:__ The context to share resources with may not be current - * on any other thread. - * - * @remarks __OS X:__ The GLFW window has no icon, as it is not a document - * window, but the dock icon will be the same as the application bundle's icon. - * For more information on bundles, see the - * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) - * in the Mac Developer Library. - * - * @remarks __OS X:__ The first time a window is created the menu bar is - * populated with common commands like Hide, Quit and About. The About entry - * opens a minimal about dialog with information from the application's bundle. - * The menu bar can be disabled with a - * [compile-time option](@ref compile_options_osx). - * - * @remarks __OS X:__ On OS X 10.10 and later the window frame will not be - * rendered at full resolution on Retina displays unless the - * `NSHighResolutionCapable` key is enabled in the application bundle's - * `Info.plist`. For more information, see - * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) - * in the Mac Developer Library. - * - * @remarks __X11:__ There is no mechanism for setting the window icon yet. - * - * @remarks __X11:__ Some window managers will not respect the placement of - * initially hidden windows. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_creation - * @sa glfwDestroyWindow - * - * @since Added in GLFW 3.0. Replaces `glfwOpenWindow`. - * - * @ingroup window - */ -GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); - -/*! @brief Destroys the specified window and its context. - * - * This function destroys the specified window and its context. On calling - * this function, no further callbacks will be called for that window. - * - * If the context of the specified window is current on the main thread, it is - * detached before being destroyed. - * - * @param[in] window The window to destroy. - * - * @note The context of the specified window must not be current on any other - * thread when this function is called. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_creation - * @sa glfwCreateWindow - * - * @since Added in GLFW 3.0. Replaces `glfwCloseWindow`. - * - * @ingroup window - */ -GLFWAPI void glfwDestroyWindow(GLFWwindow* window); - -/*! @brief Checks the close flag of the specified window. - * - * This function returns the value of the close flag of the specified window. - * - * @param[in] window The window to query. - * @return The value of the close flag. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_close - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); - -/*! @brief Sets the close flag of the specified window. - * - * This function sets the value of the close flag of the specified window. - * This can be used to override the user's attempt to close the window, or - * to signal that it should be closed. - * - * @param[in] window The window whose flag to change. - * @param[in] value The new value. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_close - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); - -/*! @brief Sets the title of the specified window. - * - * This function sets the window title, encoded as UTF-8, of the specified - * window. - * - * @param[in] window The window whose title to change. - * @param[in] title The UTF-8 encoded window title. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_title - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); - -/*! @brief Retrieves the position of the client area of the specified window. - * - * This function retrieves the position, in screen coordinates, of the - * upper-left corner of the client area of the specified window. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The window to query. - * @param[out] xpos Where to store the x-coordinate of the upper-left corner of - * the client area, or `NULL`. - * @param[out] ypos Where to store the y-coordinate of the upper-left corner of - * the client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * @sa glfwSetWindowPos - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); - -/*! @brief Sets the position of the client area of the specified window. - * - * This function sets the position, in screen coordinates, of the upper-left - * corner of the client area of the specified windowed mode window. If the - * window is a full screen window, this function does nothing. - * - * __Do not use this function__ to move an already visible window unless you - * have very good reasons for doing so, as it will confuse and annoy the user. - * - * The window manager may put limits on what positions are allowed. GLFW - * cannot and should not override these limits. - * - * @param[in] window The window to query. - * @param[in] xpos The x-coordinate of the upper-left corner of the client area. - * @param[in] ypos The y-coordinate of the upper-left corner of the client area. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * @sa glfwGetWindowPos - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); - -/*! @brief Retrieves the size of the client area of the specified window. - * - * This function retrieves the size, in screen coordinates, of the client area - * of the specified window. If you wish to retrieve the size of the - * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose size to retrieve. - * @param[out] width Where to store the width, in screen coordinates, of the - * client area, or `NULL`. - * @param[out] height Where to store the height, in screen coordinates, of the - * client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * @sa glfwSetWindowSize - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Sets the size of the client area of the specified window. - * - * This function sets the size, in screen coordinates, of the client area of - * the specified window. - * - * For full screen windows, this function selects and switches to the resolution - * closest to the specified size, without affecting the window's context. As - * the context is unaffected, the bit depths of the framebuffer remain - * unchanged. - * - * The window manager may put limits on what sizes are allowed. GLFW cannot - * and should not override these limits. - * - * @param[in] window The window to resize. - * @param[in] width The desired width of the specified window. - * @param[in] height The desired height of the specified window. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * @sa glfwGetWindowSize - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); - -/*! @brief Retrieves the size of the framebuffer of the specified window. - * - * This function retrieves the size, in pixels, of the framebuffer of the - * specified window. If you wish to retrieve the size of the window in screen - * coordinates, see @ref glfwGetWindowSize. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose framebuffer to query. - * @param[out] width Where to store the width, in pixels, of the framebuffer, - * or `NULL`. - * @param[out] height Where to store the height, in pixels, of the framebuffer, - * or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_fbsize - * @sa glfwSetFramebufferSizeCallback - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); - -/*! @brief Retrieves the size of the frame of the window. - * - * This function retrieves the size, in screen coordinates, of each edge of the - * frame of the specified window. This size includes the title bar, if the - * window has one. The size of the frame may vary depending on the - * [window-related hints](@ref window_hints_wnd) used to create it. - * - * Because this function retrieves the size of each window frame edge and not - * the offset along a particular coordinate axis, the retrieved values will - * always be zero or positive. - * - * Any or all of the size arguments may be `NULL`. If an error occurs, all - * non-`NULL` size arguments will be set to zero. - * - * @param[in] window The window whose frame size to query. - * @param[out] left Where to store the size, in screen coordinates, of the left - * edge of the window frame, or `NULL`. - * @param[out] top Where to store the size, in screen coordinates, of the top - * edge of the window frame, or `NULL`. - * @param[out] right Where to store the size, in screen coordinates, of the - * right edge of the window frame, or `NULL`. - * @param[out] bottom Where to store the size, in screen coordinates, of the - * bottom edge of the window frame, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in GLFW 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); - -/*! @brief Iconifies the specified window. - * - * This function iconifies (minimizes) the specified window if it was - * previously restored. If the window is already iconified, this function does - * nothing. - * - * If the specified window is a full screen window, the original monitor - * resolution is restored until the window is restored. - * - * @param[in] window The window to iconify. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa glfwRestoreWindow - * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwIconifyWindow(GLFWwindow* window); - -/*! @brief Restores the specified window. - * - * This function restores the specified window if it was previously iconified - * (minimized). If the window is already restored, this function does nothing. - * - * If the specified window is a full screen window, the resolution chosen for - * the window is restored on the selected monitor. - * - * @param[in] window The window to restore. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * @sa glfwIconifyWindow - * - * @since Added in GLFW 2.1. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwRestoreWindow(GLFWwindow* window); - -/*! @brief Makes the specified window visible. - * - * This function makes the specified window visible if it was previously - * hidden. If the window is already visible or is in full screen mode, this - * function does nothing. - * - * @param[in] window The window to make visible. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hide - * @sa glfwHideWindow - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwShowWindow(GLFWwindow* window); - -/*! @brief Hides the specified window. - * - * This function hides the specified window if it was previously visible. If - * the window is already hidden or is in full screen mode, this function does - * nothing. - * - * @param[in] window The window to hide. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_hide - * @sa glfwShowWindow - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwHideWindow(GLFWwindow* window); - -/*! @brief Returns the monitor that the window uses for full screen mode. - * - * This function returns the handle of the monitor that the specified window is - * in full screen on. - * - * @param[in] window The window to query. - * @return The monitor, or `NULL` if the window is in windowed mode or an error - * occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_monitor - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); - -/*! @brief Returns an attribute of the specified window. - * - * This function returns the value of an attribute of the specified window or - * its OpenGL or OpenGL ES context. - * - * @param[in] window The window to query. - * @param[in] attrib The [window attribute](@ref window_attribs) whose value to - * return. - * @return The value of the attribute, or zero if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_attribs - * - * @since Added in GLFW 3.0. Replaces `glfwGetWindowParam` and - * `glfwGetGLVersion`. - * - * @ingroup window - */ -GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); - -/*! @brief Sets the user pointer of the specified window. - * - * This function sets the user-defined pointer of the specified window. The - * current value is retained until the window is destroyed. The initial value - * is `NULL`. - * - * @param[in] window The window whose pointer to set. - * @param[in] pointer The new value. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_userptr - * @sa glfwGetWindowUserPointer - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); - -/*! @brief Returns the user pointer of the specified window. - * - * This function returns the current value of the user-defined pointer of the - * specified window. The initial value is `NULL`. - * - * @param[in] window The window whose pointer to return. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref window_userptr - * @sa glfwSetWindowUserPointer - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); - -/*! @brief Sets the position callback for the specified window. - * - * This function sets the position callback of the specified window, which is - * called when the window is moved. The callback is provided with the screen - * position of the upper-left corner of the client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_pos - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); - -/*! @brief Sets the size callback for the specified window. - * - * This function sets the size callback of the specified window, which is - * called when the window is resized. The callback is provided with the size, - * in screen coordinates, of the client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_size - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup window - */ -GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); - -/*! @brief Sets the close callback for the specified window. - * - * This function sets the close callback of the specified window, which is - * called when the user attempts to close the window, for example by clicking - * the close widget in the title bar. - * - * The close flag is set before this callback is called, but you can modify it - * at any time with @ref glfwSetWindowShouldClose. - * - * The close callback is not triggered by @ref glfwDestroyWindow. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @remarks __OS X:__ Selecting Quit from the application menu will - * trigger the close callback for all windows. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_close - * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup window - */ -GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); - -/*! @brief Sets the refresh callback for the specified window. - * - * This function sets the refresh callback of the specified window, which is - * called when the client area of the window needs to be redrawn, for example - * if the window has been exposed after having been covered by another window. - * - * On compositing window systems such as Aero, Compiz or Aqua, where the window - * contents are saved off-screen, this callback may be called only very - * infrequently or never at all. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_refresh - * - * @since Added in GLFW 2.5. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup window - */ -GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); - -/*! @brief Sets the focus callback for the specified window. - * - * This function sets the focus callback of the specified window, which is - * called when the window gains or loses input focus. - * - * After the focus callback is called for a window that lost input focus, - * synthetic key and mouse button release events will be generated for all such - * that had been pressed. For more information, see @ref glfwSetKeyCallback - * and @ref glfwSetMouseButtonCallback. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_focus - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); - -/*! @brief Sets the iconify callback for the specified window. - * - * This function sets the iconification callback of the specified window, which - * is called when the window is iconified or restored. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_iconify - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); - -/*! @brief Sets the framebuffer resize callback for the specified window. - * - * This function sets the framebuffer resize callback of the specified window, - * which is called when the framebuffer of the specified window is resized. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref window_fbsize - * - * @since Added in GLFW 3.0. - * - * @ingroup window - */ -GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); - -/*! @brief Processes all pending events. - * - * This function processes only those events that are already in the event - * queue and then returns immediately. Processing events will cause the window - * and input callbacks associated with those events to be called. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * On some platforms, certain events are sent directly to the application - * without going through the event queue, causing callbacks to be called - * outside of a call to one of the event processing functions. - * - * Event processing is not required for joystick input to work. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref events - * @sa glfwWaitEvents - * - * @since Added in GLFW 1.0. - * - * @ingroup window - */ -GLFWAPI void glfwPollEvents(void); - -/*! @brief Waits until events are queued and processes them. - * - * This function puts the calling thread to sleep until at least one event is - * available in the event queue. Once one or more events are available, - * it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue - * are processed and the function then returns immediately. Processing events - * will cause the window and input callbacks associated with those events to be - * called. - * - * Since not all events are associated with callbacks, this function may return - * without a callback having been called even if you are monitoring all - * callbacks. - * - * On some platforms, a window move, resize or menu operation will cause event - * processing to block. This is due to how event processing is designed on - * those platforms. You can use the - * [window refresh callback](@ref window_refresh) to redraw the contents of - * your window when necessary during such operations. - * - * On some platforms, certain callbacks may be called outside of a call to one - * of the event processing functions. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * Event processing is not required for joystick input to work. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref events - * @sa glfwPollEvents - * - * @since Added in GLFW 2.5. - * - * @ingroup window - */ -GLFWAPI void glfwWaitEvents(void); - -/*! @brief Posts an empty event to the event queue. - * - * This function posts an empty event from the current thread to the event - * queue, causing @ref glfwWaitEvents to return. - * - * If no windows exist, this function returns immediately. For synchronization - * of threads in applications that do not create windows, use your threading - * library of choice. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref events - * @sa glfwWaitEvents - * - * @since Added in GLFW 3.1. - * - * @ingroup window - */ -GLFWAPI void glfwPostEmptyEvent(void); - -/*! @brief Returns the value of an input option for the specified window. - * - * This function returns the value of an input option for the specified window. - * The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @param[in] window The window to query. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa glfwSetInputMode - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); - -/*! @brief Sets an input option for the specified window. - * - * This function sets an input mode option for the specified window. The mode - * must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * - * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor - * modes: - * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. - * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client - * area of the window but does not restrict the cursor from leaving. - * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual - * and unlimited cursor movement. This is useful for implementing for - * example 3D camera controls. - * - * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GL_TRUE` to - * enable sticky keys, or `GL_FALSE` to disable it. If sticky keys are - * enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` - * the next time it is called even if the key had been released before the - * call. This is useful when you are only interested in whether keys have been - * pressed but not when or in which order. - * - * If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either - * `GL_TRUE` to enable sticky mouse buttons, or `GL_FALSE` to disable it. If - * sticky mouse buttons are enabled, a mouse button press will ensure that @ref - * glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even if - * the mouse button had been released before the call. This is useful when you - * are only interested in whether mouse buttons have been pressed but not when - * or in which order. - * - * @param[in] window The window whose input mode to set. - * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or - * `GLFW_STICKY_MOUSE_BUTTONS`. - * @param[in] value The new value of the specified input mode. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa glfwGetInputMode - * - * @since Added in GLFW 3.0. Replaces `glfwEnable` and `glfwDisable`. - * - * @ingroup input - */ -GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); - -/*! @brief Returns the last reported state of a keyboard key for the specified - * window. - * - * This function returns the last state reported for the specified key to the - * specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to - * the key callback. - * - * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns - * `GLFW_PRESS` the first time you call it for a key that was pressed, even if - * that key has already been released. - * - * The key functions deal with physical keys, with [key tokens](@ref keys) - * named after their use on the standard US keyboard layout. If you want to - * input text, use the Unicode character callback instead. - * - * The [modifier key bit masks](@ref mods) are not key tokens and cannot be - * used with this function. - * - * @param[in] window The desired window. - * @param[in] key The desired [keyboard key](@ref keys). `GLFW_KEY_UNKNOWN` is - * not a valid key for this function. - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetKey(GLFWwindow* window, int key); - -/*! @brief Returns the last reported state of a mouse button for the specified - * window. - * - * This function returns the last state reported for the specified mouse button - * to the specified window. The returned state is one of `GLFW_PRESS` or - * `GLFW_RELEASE`. - * - * If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function - * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, - * even if that mouse button has already been released. - * - * @param[in] window The desired window. - * @param[in] button The desired [mouse button](@ref buttons). - * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup input - */ -GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); - -/*! @brief Retrieves the position of the cursor relative to the client area of - * the window. - * - * This function returns the position of the cursor, in screen coordinates, - * relative to the upper-left corner of the client area of the specified - * window. - * - * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor - * position is unbounded and limited only by the minimum and maximum values of - * a `double`. - * - * The coordinate can be converted to their integer equivalents with the - * `floor` function. Casting directly to an integer type works for positive - * coordinates, but fails for negative ones. - * - * Any or all of the position arguments may be `NULL`. If an error occurs, all - * non-`NULL` position arguments will be set to zero. - * - * @param[in] window The desired window. - * @param[out] xpos Where to store the cursor x-coordinate, relative to the - * left edge of the client area, or `NULL`. - * @param[out] ypos Where to store the cursor y-coordinate, relative to the to - * top edge of the client area, or `NULL`. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa glfwSetCursorPos - * - * @since Added in GLFW 3.0. Replaces `glfwGetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); - -/*! @brief Sets the position of the cursor, relative to the client area of the - * window. - * - * This function sets the position, in screen coordinates, of the cursor - * relative to the upper-left corner of the client area of the specified - * window. The window must have input focus. If the window does not have - * input focus when this function is called, it fails silently. - * - * __Do not use this function__ to implement things like camera controls. GLFW - * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the - * cursor, transparently re-centers it and provides unconstrained cursor - * motion. See @ref glfwSetInputMode for more information. - * - * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is - * unconstrained and limited only by the minimum and maximum values of - * a `double`. - * - * @param[in] window The desired window. - * @param[in] xpos The desired x-coordinate, relative to the left edge of the - * client area. - * @param[in] ypos The desired y-coordinate, relative to the top edge of the - * client area. - * - * @remarks __X11:__ Due to the asynchronous nature of a modern X desktop, it - * may take a moment for the window focus event to arrive. This means you will - * not be able to set the cursor position directly after window creation. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * @sa glfwGetCursorPos - * - * @since Added in GLFW 3.0. Replaces `glfwSetMousePos`. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); - -/*! @brief Creates a custom cursor. - * - * Creates a new custom cursor image that can be set for a window with @ref - * glfwSetCursor. The cursor can be destroyed with @ref glfwDestroyCursor. - * Any remaining cursors are destroyed by @ref glfwTerminate. - * - * The pixels are 32-bit little-endian RGBA, i.e. eight bits per channel. They - * are arranged canonically as packed sequential rows, starting from the - * top-left corner. - * - * The cursor hotspot is specified in pixels, relative to the upper-left corner - * of the cursor image. Like all other coordinate systems in GLFW, the X-axis - * points to the right and the Y-axis points down. - * - * @param[in] image The desired cursor image. - * @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. - * @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. - * - * @return The handle of the created cursor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The specified image data is copied before this function returns. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwDestroyCursor - * @sa glfwCreateStandardCursor - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); - -/*! @brief Creates a cursor with a standard shape. - * - * Returns a cursor with a [standard shape](@ref shapes), that can be set for - * a window with @ref glfwSetCursor. - * - * @param[in] shape One of the [standard shapes](@ref shapes). - * - * @return A new cursor ready to use or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwCreateCursor - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); - -/*! @brief Destroys a cursor. - * - * This function destroys a cursor previously created with @ref - * glfwCreateCursor. Any remaining cursors will be destroyed by @ref - * glfwTerminate. - * - * @param[in] cursor The cursor object to destroy. - * - * @par Reentrancy - * This function may not be called from a callback. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * @sa glfwCreateCursor - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); - -/*! @brief Sets the cursor for the window. - * - * This function sets the cursor image to be used when the cursor is over the - * client area of the specified window. The set cursor will only be visible - * when the [cursor mode](@ref cursor_mode) of the window is - * `GLFW_CURSOR_NORMAL`. - * - * On some platforms, the set cursor may not be visible unless the window also - * has input focus. - * - * @param[in] window The window to set the cursor for. - * @param[in] cursor The cursor to set, or `NULL` to switch back to the default - * arrow cursor. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_object - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); - -/*! @brief Sets the key callback. - * - * This function sets the key callback of the specified window, which is called - * when a key is pressed, repeated or released. - * - * The key functions deal with physical keys, with layout independent - * [key tokens](@ref keys) named after their values in the standard US keyboard - * layout. If you want to input text, use the - * [character callback](@ref glfwSetCharCallback) instead. - * - * When a window loses input focus, it will generate synthetic key release - * events for all pressed keys. You can tell these events from user-generated - * events by the fact that the synthetic ones are generated after the focus - * loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * The scancode of a key is specific to that platform or sometimes even to that - * machine. Scancodes are intended to allow users to bind keys that don't have - * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their - * state is not saved and so it cannot be queried with @ref glfwGetKey. - * - * Sometimes GLFW needs to generate synthetic key events, in which case the - * scancode may be zero. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new key callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_key - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup input - */ -GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); - -/*! @brief Sets the Unicode character callback. - * - * This function sets the character callback of the specified window, which is - * called when a Unicode character is input. - * - * The character callback is intended for Unicode text input. As it deals with - * characters, it is keyboard layout dependent, whereas the - * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 - * to physical keys, as a key may produce zero, one or more characters. If you - * want to know whether a specific physical key was pressed or released, see - * the key callback instead. - * - * The character callback behaves as system text input normally does and will - * not be called if modifier keys are held down that would prevent normal text - * input on that platform, for example a Super (Command) key on OS X or Alt key - * on Windows. There is a - * [character with modifiers callback](@ref glfwSetCharModsCallback) that - * receives these events. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in GLFW 2.4. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup input - */ -GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); - -/*! @brief Sets the Unicode character with modifiers callback. - * - * This function sets the character with modifiers callback of the specified - * window, which is called when a Unicode character is input regardless of what - * modifier keys are used. - * - * The character with modifiers callback is intended for implementing custom - * Unicode character input. For regular Unicode text input, see the - * [character callback](@ref glfwSetCharCallback). Like the character - * callback, the character with modifiers callback deals with characters and is - * keyboard layout dependent. Characters do not map 1:1 to physical keys, as - * a key may produce zero, one or more characters. If you want to know whether - * a specific physical key was pressed or released, see the - * [key callback](@ref glfwSetKeyCallback) instead. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or an - * error occurred. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_char - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun); - -/*! @brief Sets the mouse button callback. - * - * This function sets the mouse button callback of the specified window, which - * is called when a mouse button is pressed or released. - * - * When a window loses input focus, it will generate synthetic mouse button - * release events for all pressed mouse buttons. You can tell these events - * from user-generated events by the fact that the synthetic ones are generated - * after the focus loss event has been processed, i.e. after the - * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref input_mouse_button - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. Updated callback signature. - * - * @ingroup input - */ -GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); - -/*! @brief Sets the cursor position callback. - * - * This function sets the cursor position callback of the specified window, - * which is called when the cursor is moved. The callback is provided with the - * position, in screen coordinates, relative to the upper-left corner of the - * client area of the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_pos - * - * @since Added in GLFW 3.0. Replaces `glfwSetMousePosCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); - -/*! @brief Sets the cursor enter/exit callback. - * - * This function sets the cursor boundary crossing callback of the specified - * window, which is called when the cursor enters or leaves the client area of - * the window. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new callback, or `NULL` to remove the currently set - * callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref cursor_enter - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); - -/*! @brief Sets the scroll callback. - * - * This function sets the scroll callback of the specified window, which is - * called when a scrolling device is used, such as a mouse wheel or scrolling - * area of a touchpad. - * - * The scroll callback receives all scrolling input, like that from a mouse - * wheel or a touchpad scrolling area. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently - * set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref scrolling - * - * @since Added in GLFW 3.0. Replaces `glfwSetMouseWheelCallback`. - * - * @ingroup input - */ -GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); - -/*! @brief Sets the file drop callback. - * - * This function sets the file drop callback of the specified window, which is - * called when one or more dragged files are dropped on the window. - * - * Because the path array and its strings may have been generated specifically - * for that event, they are not guaranteed to be valid after the callback has - * returned. If you wish to use them after the callback returns, you need to - * make a deep copy. - * - * @param[in] window The window whose callback to set. - * @param[in] cbfun The new file drop callback, or `NULL` to remove the - * currently set callback. - * @return The previously set callback, or `NULL` if no callback was set or the - * library had not been [initialized](@ref intro_init). - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref path_drop - * - * @since Added in GLFW 3.1. - * - * @ingroup input - */ -GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); - -/*! @brief Returns whether the specified joystick is present. - * - * This function returns whether the specified joystick is present. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @return `GL_TRUE` if the joystick is present, or `GL_FALSE` otherwise. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick - * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickParam`. - * - * @ingroup input - */ -GLFWAPI int glfwJoystickPresent(int joy); - -/*! @brief Returns the values of all axes of the specified joystick. - * - * This function returns the values of all axes of the specified joystick. - * Each element in the array is a value between -1.0 and 1.0. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of axis values in the returned - * array. This is set to zero if an error occurred. - * @return An array of axis values, or `NULL` if the joystick is not present. - * - * @par Pointer Lifetime - * The returned array is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified joystick is disconnected, this - * function is called again for that joystick or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_axis - * - * @since Added in GLFW 3.0. Replaces `glfwGetJoystickPos`. - * - * @ingroup input - */ -GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); - -/*! @brief Returns the state of all buttons of the specified joystick. - * - * This function returns the state of all buttons of the specified joystick. - * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @param[out] count Where to store the number of button states in the returned - * array. This is set to zero if an error occurred. - * @return An array of button states, or `NULL` if the joystick is not present. - * - * @par Pointer Lifetime - * The returned array is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified joystick is disconnected, this - * function is called again for that joystick or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_button - * - * @since Added in GLFW 2.2. - * - * @par - * __GLFW 3:__ Changed to return a dynamic array. - * - * @ingroup input - */ -GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); - -/*! @brief Returns the name of the specified joystick. - * - * This function returns the name, encoded as UTF-8, of the specified joystick. - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. - * - * @param[in] joy The [joystick](@ref joysticks) to query. - * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick - * is not present. - * - * @par Pointer Lifetime - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the specified joystick is disconnected, this - * function is called again for that joystick or the library is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref joystick_name - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetJoystickName(int joy); - -/*! @brief Sets the clipboard to the specified string. - * - * This function sets the system clipboard to the specified, UTF-8 encoded - * string. - * - * @param[in] window The window that will own the clipboard contents. - * @param[in] string A UTF-8 encoded string. - * - * @par Pointer Lifetime - * The specified string is copied before this function returns. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwGetClipboardString - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); - -/*! @brief Returns the contents of the clipboard as a string. - * - * This function returns the contents of the system clipboard, if it contains - * or is convertible to a UTF-8 encoded string. - * - * @param[in] window The window that will request the clipboard contents. - * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` - * if an [error](@ref error_handling) occurred. - * - * @par Pointer Lifetime - * The returned string is allocated and freed by GLFW. You should not free it - * yourself. It is valid until the next call to @ref - * glfwGetClipboardString or @ref glfwSetClipboardString, or until the library - * is terminated. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref clipboard - * @sa glfwSetClipboardString - * - * @since Added in GLFW 3.0. - * - * @ingroup input - */ -GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); - -/*! @brief Returns the value of the GLFW timer. - * - * This function returns the value of the GLFW timer. Unless the timer has - * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW - * was initialized. - * - * The resolution of the timer is system dependent, but is usually on the order - * of a few micro- or nanoseconds. It uses the highest-resolution monotonic - * time source on each supported platform. - * - * @return The current value, in seconds, or zero if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @sa @ref time - * - * @since Added in GLFW 1.0. - * - * @ingroup input - */ -GLFWAPI double glfwGetTime(void); - -/*! @brief Sets the GLFW timer. - * - * This function sets the value of the GLFW timer. It then continues to count - * up from that value. The value must be a positive finite number less than - * or equal to 18446744073.0, which is approximately 584.5 years. - * - * @param[in] time The new value, in seconds. - * - * @remarks The upper limit of the timer is calculated as - * floor((264 - 1) / 109) and is due to implementations - * storing nanoseconds in 64 bits. The limit may be increased in the future. - * - * @par Thread Safety - * This function may only be called from the main thread. - * - * @sa @ref time - * - * @since Added in GLFW 2.2. - * - * @ingroup input - */ -GLFWAPI void glfwSetTime(double time); - -/*! @brief Makes the context of the specified window current for the calling - * thread. - * - * This function makes the OpenGL or OpenGL ES context of the specified window - * current on the calling thread. A context can only be made current on - * a single thread at a time and each thread can have only a single current - * context at a time. - * - * By default, making a context non-current implicitly forces a pipeline flush. - * On machines that support `GL_KHR_context_flush_control`, you can control - * whether a context performs this flush by setting the - * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. - * - * @param[in] window The window whose context to make current, or `NULL` to - * detach the current context. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_current - * @sa glfwGetCurrentContext - * - * @since Added in GLFW 3.0. - * - * @ingroup context - */ -GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); - -/*! @brief Returns the window whose context is current on the calling thread. - * - * This function returns the window whose OpenGL or OpenGL ES context is - * current on the calling thread. - * - * @return The window whose context is current, or `NULL` if no window's - * context is current. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_current - * @sa glfwMakeContextCurrent - * - * @since Added in GLFW 3.0. - * - * @ingroup context - */ -GLFWAPI GLFWwindow* glfwGetCurrentContext(void); - -/*! @brief Swaps the front and back buffers of the specified window. - * - * This function swaps the front and back buffers of the specified window. If - * the swap interval is greater than zero, the GPU driver waits the specified - * number of screen updates before swapping the buffers. - * - * @param[in] window The window whose buffers to swap. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa glfwSwapInterval - * - * @since Added in GLFW 1.0. - * - * @par - * __GLFW 3:__ Added window handle parameter. - * - * @ingroup window - */ -GLFWAPI void glfwSwapBuffers(GLFWwindow* window); - -/*! @brief Sets the swap interval for the current context. - * - * This function sets the swap interval for the current context, i.e. the - * number of screen updates to wait from the time @ref glfwSwapBuffers was - * called before swapping the buffers and returning. This is sometimes called - * _vertical synchronization_, _vertical retrace synchronization_ or just - * _vsync_. - * - * Contexts that support either of the `WGL_EXT_swap_control_tear` and - * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, - * which allow the driver to swap even if a frame arrives a little bit late. - * You can check for the presence of these extensions using @ref - * glfwExtensionSupported. For more information about swap tearing, see the - * extension specifications. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * @param[in] interval The minimum number of screen updates to wait for - * until the buffers are swapped by @ref glfwSwapBuffers. - * - * @remarks This function is not called during context creation, leaving the - * swap interval set to whatever is the default on that platform. This is done - * because some swap interval extensions used by GLFW do not allow the swap - * interval to be reset to zero once it has been set to a non-zero value. - * - * @remarks Some GPU drivers do not honor the requested swap interval, either - * because of a user setting that overrides the application's request or due to - * bugs in the driver. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref buffer_swap - * @sa glfwSwapBuffers - * - * @since Added in GLFW 1.0. - * - * @ingroup context - */ -GLFWAPI void glfwSwapInterval(int interval); - -/*! @brief Returns whether the specified extension is available. - * - * This function returns whether the specified - * [client API extension](@ref context_glext) is supported by the current - * OpenGL or OpenGL ES context. It searches both for OpenGL and OpenGL ES - * extension and platform-specific context creation API extensions. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * As this functions retrieves and searches one or more extension strings each - * call, it is recommended that you cache its results if it is going to be used - * frequently. The extension strings will not change during the lifetime of - * a context, so there is no danger in doing this. - * - * @param[in] extension The ASCII encoded name of the extension. - * @return `GL_TRUE` if the extension is available, or `GL_FALSE` otherwise. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_glext - * @sa glfwGetProcAddress - * - * @since Added in GLFW 1.0. - * - * @ingroup context - */ -GLFWAPI int glfwExtensionSupported(const char* extension); - -/*! @brief Returns the address of the specified function for the current - * context. - * - * This function returns the address of the specified - * [core or extension function](@ref context_glext), if it is supported - * by the current context. - * - * A context must be current on the calling thread. Calling this function - * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. - * - * @param[in] procname The ASCII encoded name of the function. - * @return The address of the function, or `NULL` if the function is - * unavailable or an [error](@ref error_handling) occurred. - * - * @remarks The addresses of a given function is not guaranteed to be the same - * between contexts. - * - * @remarks This function may return a non-`NULL` address despite the - * associated version or extension not being available. Always check the - * context version or extension string presence first. - * - * @par Pointer Lifetime - * The returned function pointer is valid until the context is destroyed or the - * library is terminated. - * - * @par Thread Safety - * This function may be called from any thread. - * - * @sa @ref context_glext - * @sa glfwExtensionSupported - * - * @since Added in GLFW 1.0. - * - * @ingroup context - */ -GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); - - -/************************************************************************* - * Global definition cleanup - *************************************************************************/ - -/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ - -#ifdef GLFW_WINGDIAPI_DEFINED - #undef WINGDIAPI - #undef GLFW_WINGDIAPI_DEFINED -#endif - -#ifdef GLFW_CALLBACK_DEFINED - #undef CALLBACK - #undef GLFW_CALLBACK_DEFINED -#endif - -/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ - - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_h_ */ - diff --git a/win32/include/GLFW/glfw3native.h b/win32/include/GLFW/glfw3native.h deleted file mode 100644 index b3ce748..0000000 --- a/win32/include/GLFW/glfw3native.h +++ /dev/null @@ -1,356 +0,0 @@ -/************************************************************************* - * GLFW 3.1 - www.glfw.org - * A library for OpenGL, window and input - *------------------------------------------------------------------------ - * Copyright (c) 2002-2006 Marcus Geelnard - * Copyright (c) 2006-2010 Camilla Berglund - * - * This software is provided 'as-is', without any express or implied - * warranty. In no event will the authors be held liable for any damages - * arising from the use of this software. - * - * Permission is granted to anyone to use this software for any purpose, - * including commercial applications, and to alter it and redistribute it - * freely, subject to the following restrictions: - * - * 1. The origin of this software must not be misrepresented; you must not - * claim that you wrote the original software. If you use this software - * in a product, an acknowledgment in the product documentation would - * be appreciated but is not required. - * - * 2. Altered source versions must be plainly marked as such, and must not - * be misrepresented as being the original software. - * - * 3. This notice may not be removed or altered from any source - * distribution. - * - *************************************************************************/ - -#ifndef _glfw3_native_h_ -#define _glfw3_native_h_ - -#ifdef __cplusplus -extern "C" { -#endif - - -/************************************************************************* - * Doxygen documentation - *************************************************************************/ - -/*! @defgroup native Native access - * - * **By using the native access functions you assert that you know what you're - * doing and how to fix problems caused by using them. If you don't, you - * shouldn't be using them.** - * - * Before the inclusion of @ref glfw3native.h, you must define exactly one - * window system API macro and exactly one context creation API macro. Failure - * to do this will cause a compile-time error. - * - * The available window API macros are: - * * `GLFW_EXPOSE_NATIVE_WIN32` - * * `GLFW_EXPOSE_NATIVE_COCOA` - * * `GLFW_EXPOSE_NATIVE_X11` - * - * The available context API macros are: - * * `GLFW_EXPOSE_NATIVE_WGL` - * * `GLFW_EXPOSE_NATIVE_NSGL` - * * `GLFW_EXPOSE_NATIVE_GLX` - * * `GLFW_EXPOSE_NATIVE_EGL` - * - * These macros select which of the native access functions that are declared - * and which platform-specific headers to include. It is then up your (by - * definition platform-specific) code to handle which of these should be - * defined. - */ - - -/************************************************************************* - * System headers and types - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) - // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for - // example to allow applications to correctly declare a GL_ARB_debug_output - // callback) but windows.h assumes no one will define APIENTRY before it does - #undef APIENTRY - #include -#elif defined(GLFW_EXPOSE_NATIVE_COCOA) - #include - #if defined(__OBJC__) - #import - #else - typedef void* id; - #endif -#elif defined(GLFW_EXPOSE_NATIVE_X11) - #include - #include -#else - #error "No window API selected" -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) - /* WGL is declared by windows.h */ -#elif defined(GLFW_EXPOSE_NATIVE_NSGL) - /* NSGL is declared by Cocoa.h */ -#elif defined(GLFW_EXPOSE_NATIVE_GLX) - #include -#elif defined(GLFW_EXPOSE_NATIVE_EGL) - #include -#else - #error "No context API selected" -#endif - - -/************************************************************************* - * Functions - *************************************************************************/ - -#if defined(GLFW_EXPOSE_NATIVE_WIN32) -/*! @brief Returns the adapter device name of the specified monitor. - * - * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) - * of the specified monitor, or `NULL` if an [error](@ref error_handling) - * occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the display device name of the specified monitor. - * - * @return The UTF-8 encoded display device name (for example - * `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.1. - * - * @ingroup native - */ -GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `HWND` of the specified window. - * - * @return The `HWND` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_WGL) -/*! @brief Returns the `HGLRC` of the specified window. - * - * @return The `HGLRC` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_COCOA) -/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. - * - * @return The `CGDirectDisplayID` of the specified monitor, or - * `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.1. - * - * @ingroup native - */ -GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); - -/*! @brief Returns the `NSWindow` of the specified window. - * - * @return The `NSWindow` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_NSGL) -/*! @brief Returns the `NSOpenGLContext` of the specified window. - * - * @return The `NSOpenGLContext` of the specified window, or `nil` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_X11) -/*! @brief Returns the `Display` used by GLFW. - * - * @return The `Display` used by GLFW, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI Display* glfwGetX11Display(void); - -/*! @brief Returns the `RRCrtc` of the specified monitor. - * - * @return The `RRCrtc` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.1. - * - * @ingroup native - */ -GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); - -/*! @brief Returns the `RROutput` of the specified monitor. - * - * @return The `RROutput` of the specified monitor, or `None` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.1. - * - * @ingroup native - */ -GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); - -/*! @brief Returns the `Window` of the specified window. - * - * @return The `Window` of the specified window, or `None` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI Window glfwGetX11Window(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_GLX) -/*! @brief Returns the `GLXContext` of the specified window. - * - * @return The `GLXContext` of the specified window, or `NULL` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); -#endif - -#if defined(GLFW_EXPOSE_NATIVE_EGL) -/*! @brief Returns the `EGLDisplay` used by GLFW. - * - * @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI EGLDisplay glfwGetEGLDisplay(void); - -/*! @brief Returns the `EGLContext` of the specified window. - * - * @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); - -/*! @brief Returns the `EGLSurface` of the specified window. - * - * @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an - * [error](@ref error_handling) occurred. - * - * @par Thread Safety - * This function may be called from any thread. Access is not synchronized. - * - * @par History - * Added in GLFW 3.0. - * - * @ingroup native - */ -GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* _glfw3_native_h_ */ - diff --git a/win32/lib/OPENGL32.LIB b/win32/lib/OPENGL32.LIB deleted file mode 100644 index 590407992033686600e8bbe75d0bd0f8e6385863..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77112 zcmeHwdzf5Bnf`Y|fDnU5t^ops03n1JbD4yoh`CGx!AUYE0ThwY$@I*$bY^CIdO~1X zmvvnhbwxo$L>3Vd6%oM;BBDk_Ma3H;A|gfvjEIPciU|07>w3Pg&gsfDr~9AZv-3Rf zoUX6Fs<*y6Rdwpr?HqD!skX8Ixbd%?BL5aHTsV8)F|!xUmEtM0t$WVV^A{}Czt0#? zH0BYacYK%VT~86cdn(a|Lk8C^B2swoH3k=MgB-YMAA|SYL8S2B4ukisfqM-lhi^BS zdIBXHx8MpKI>X{BT!F*(FgSb+^cA)kOxr+-!V%pTx8n*-pKEa)uE3F(8_YmBjmL2X zj_R?v4_9Djmj&XOc{|ZBuQj;oIU zcBjDyVZX*zxB{0?u-JmD!ovn1>L${-4Oifb=@ysZ3j8lwRB=_f&)~{VB8?ky1wIUJ zjSFy9c-r8qGl(?q!WH<)LW^r~1+JcGaW1Y3+YLUtj!0uGuD~@jEiS_q_}EyBAzT$6 zF!;;>k;08#1~*-b`~I-6*RdA3A9n%YNBR^VbU+#(R6sfv zeuZ>uAdSBQwjrGwNaHr(*GQ)Z()eoyq*LK>+)IT&9At4Jt_sf?JW(amxF1*Gk0)B( zf-CUkbPI4i3H)iC#THx@kT!*<-e7SjuE3ucT6_Xm;OR*g7vQS!jKN>}i8SuR75M83 z7PsIEJOjHl25?n?j>6xUSX_@Q@a#So=i#dGm_|Zl$)JX-!Zw3s6(t(C;R=jF{nWS& zS74`IEb6!_JY+By^-|-jxB@%Rv_O5_8Q5i<#b#U;9yZu@4J8^|aRtWBvbX|QV7KuW zTX0o))L{HNN;FV^#{(~!ZE+>8z=R1F=isV<_D5m&lMVK{hZ2Q-7g=17D==x2#oKXJ zc+z0M(a!{46a2Rr0~gm3~oW$R`^n<1gOg z1-74T@I1<}!V8E4NcQZqKv~)o*lV`M)wlwC3|TygEAY~V7T4ekylkSyxwtB9H<-AN z5{<360xzFwaT%__9%D7=i7m4L*)|75--N8R#k8 zhWIqDz!mt)1dDTURY3hw`05&qt+)bTLpTkD`5LfwoCWU7R)uW_Uq?8NJ8%VV@36QQ zSKu4xTRe*^a7VAjy|@D3TyAkQuE4jZSzL-M@NI-qxD&Q2e0vv*^Kb=zIM?DzT!HHm zzrwBC4StIIscZV>5VRyB3_J-2NGg*|mUP`#6+*cVmzB;_5I*0%rE(y6_N~q$7`kL~_!CKFv zISY7zte*<8Y@jDU{=mcP`oxR0K$m+c-KEvR;quCIy|lbiEz6WQ@H(rndVIOwS?(>3 zRO{Wf!HtW1dTQn2VHG&$XYL9#mJSY`y>xJ(UfxpId7C3jb!+8Pz3j9N!_rU|Xm^#) zF4tTT++Y>I4ib9!aGm99Ib_MmnD+3-T4h67M~D0zC@-2jThnxwbA5bBRo z#A~i8>nh4q;O>7TFCTVop^*_Cz zzPF3!>PL;a(c0nsmkw43Yx6cZTbL`**lY-_zII8Co<(y_p6NJ@E6@;e^yI|RE7DVLjk3-l9%HWDAFnC(kBTICwmHR@uVg**^mua^2utHE8)DkrlwKsde5 zK#%Hk=$2ajaPk!cJ>@Murjbv7OJ5tW@fPJri+WAU(%&MqD>}wI8@j?m>)#@@D>OQ^ z%wH|iz12RvIKT@1TZDGS#dr(uRfDxnrK)ePh1131gw}rH40K$RZFOXu?SwKO*=k!I z*K7-Cz~yq(>Ezjk;);#|9^%GK;|$_)dFyoY;z4oc@fc?ikIQ8nk1V}wO2hSXt$T2I zu6aM|tA-L68qD%fu+#urz{77^4q2Wa8||?8MNr>%5n(&h?Es+OBJ|3GkhRuINF*HyYyFF!u} zFz{;PS&&KtTj!dr%&^)Afe$C11F1BOEkEbx+J}G-C!PVRG>pw;WtcYq0B`|=_CFN| z@!97=CO%X*{gn3sjUcNR#+RRW^Gq|}SM~83K_))eOr?67AftzBDbr^JS-miQ`T6G? ze8(HK_o+CDFKF$(o@=@SL6|<Yt8~eCcZHLf>z!KcTHR%$ix@c+@OU& zxm>H4xA=N1oGvaWv^gi7fsU=ORz=iSCzG+r(q?sRJ>{-|$K{e!(UAr^wtiX_Q9GSX zrbU)4qvPwPa7rfMC38ACshQ{Mqt%hM(FsL*=H=y$uZK2>tc6Y}O5KcKLc|bb?yvgd#mbjk7wgz6qyHkFRS^Coes&o>?8^4C0ZcC#YdIpsQcP8N?&= zC#YFVtCb-$1EEJ3h112O2c%YF7Nv$MGSiXDh`jDdwYt2t(T;R3WiF?&e6Y{fKlh9K z*iMh~68$9zY<+XTSSaL_PQCJyp=uZ!Pm{BpJ6-q_Dg$d+GT4@tzF={S{v$9-mm(xOB<~H|oIi8i} z#qM)nsApndv8mKop3`Xuo}tSHEM6_13qAeP>h!FD=`9=B%yPlI0u5%lQpuzWLT0UZ z$ym6BN+lBurj6V<6%y=SEEXkWX-S<@hgk#_;|ernELn>Xj#=bgG8S%;Qjr!dFPD4N z+6Ob4X`9F#p^I}Zrq(vrt+sB=Ly6N|gKQ|*bOqD3M!KDrT7R($1%23zJqxGP=^8Bc zC>`4zF_+WmE)5T_>#q%t^w~Bm5O}@8Asvw(=k87&-hX7cKV|A>E~n91E1hMn*H%fl z(^^_Bmue=t{-^L;ym8~mCO7V{lv9Dw)8o=CBJUPj`YF$2O9eu2ZM{6Ou~KF6F^SOZ zEDxdiw_Ob+&%2$L4Y;y2tXIKcX5Pf@1WwO(K%m7YIkb{;J1rf(3##UC!S0++N1N`1 zc0k`bosP*xooxTp`E^!?OB>9}7cis_=f7+q^-g~~-{qBo%5c9ar0H+(TSZZ^p6;jf zLor)i$Ks3)#$PzS4uV@H^Mny@r?s*)grOugpRXQ$?l<@Cwe!Nt*ZgL_crBZ+8(R3< z-`p3&O1fGoU-O&!9$%}dVJx-!MRPNEsO8!<#G|!j%VwqE_iRebx`Vio4l~c~LP?vJ zZ7yLFmJP540v8(-+gFEBlGU_>Y^kCa4&qJrg%3=<+iUG z2(mGnG+}DbZyZ+n{5A+JB7}=T4`Vy3zY25*5QOKSKGcc2yHDB z+H32BwK9)56=d~zlv*zvA1bQtru0=cbt(|?L9FJ+O&&T$C&_5y%{b7s5~qn(Wj*|< zEZt5^El1Q`W|^FtO&0>Er$ReD{VWLtPES4iot|zO1A)`SV!S1TgLujh*jK(l!1Tm> zy)G2j1W464RfSe6FK`&VAn0HATnUD!q@#d-T zRD-us#O(?=;@0IUBVsW-T~!%EWh=|mMuo^|8yVL&FTL!=RVUoO`Z6&Kvld;K0lTyW z=}w(Y2QNbD8<&n!NHUuIW*E)v{je`ruI7VUNMxMq1uCOyB^k|tJ^M~%xb(}ZeTIb+ z8E5*cF4GXo8-xnd<3r`BXxQmyiuf5Je-BwX{{NoV@S=tV{n($K%ZXUK%-$?PGjvxtVnkYP?$sb zyO#v*FW(S!*QTnIVLJbTz{TUmF0Me}^iHmn&l(!6VF!XvvT!<`#kE@L>}A#RCKM@C zdP9lRTv8e6K|@p@so8PEK;ZQBd#~=`mfdh*M&xwu%P5}opkJ%*fJsBX+=oK%L#NWs zy{O&?6L39inwy1CnnL7s-NHbZa9sg&gkE32GiMTR8j3*d!sz#SM_{^j8IjP%3Qg1E zs3m;H5%}A8Fda>>R#WvtUhjCDD$K)gqbpu`dOLNUR*2N;)y*+!xhy=+P-rm9~V+}h7nXh_Aqv9R~S$P$7{E6>ymi04^g;&nPQ%9OwZ^)j*Ky)$MIy zoh>!jV7tanZ^f{U&OHd3)9G~ADuXrbWjn{;F87L)@8QBBDrd95Nm*Hrw#p$_)?5r$ z=Ctt~F?BW=uL^};AI}isr|+kFvV>9-0=rPqPthIR}Ce`d6wur;4uIj`~5)|tCECn17?g#=rUlJof4`84*}g{ z6Z$GJb7$N~VB9VVZ3Z3&*6f9tVJbVdx0PJ-u?ho+jokX+m#;G&FEIW*P|TVNHiX{ z*MU2c)~66x=g&~~fJyfey$yIAIQ8f72NuB2-p?W|(D^x>YyeFCJa&EqW4?eq0=5CS z-3%UJ#upJMxX!->X}=eI$cIajmJ5-NtFV*&wnvC&;kpew%~#>~#jr;mJun1J{~L5a z4&bVe7?^b%PWS;Pe1+&7;89@BS8*SJSzm)6Fm5Ys0k#2azK(VY=(rtq4>5xw3IckOPuo!*rv4P^fDISpdfEf1W4}bZ zi0iEnA^zVXPkxV+2yky^J%=&_jC~&UZtsM8QI2~LN$B2-k+1IqA8b1A(>V13crWhR z{jhE7O^65g<(%)seBd_R-xCn;qrZg>s0&Y{yq=EmV?RN(8Q2b-j&eI0`MCAVxL2@i z9LnXnxPN?31T{oa*cLc7s;+J&%Lp2h@{ zztF^FL$W40g4QO}>E+2(I+T7-kJA(MB>jQ@NH^1wG=q+!ne+;pMX#jUG>7KWJnEqN zw1AGLg>($Pie62}(rf5AdMz!Y#k7Q$QYS5=<#arqKu^&ZX3++sY zQD3rm@@HC<{FP2hPEH=9Q<6iH74(MWMEV=OF?k&wLSvJilU3;Ckv9JlZDAK$+5|6l2;|KPQFS{)2T@pt)x}7n!4%rw1(Ewo08L# zN9fJTamj0ww? zWS`{w^aEO-{E(idfn-Ipoz6`DL4(PO$?xcNT2E(Ci8jzi>Y+0AQXlnGh2BDEQk6E* z01eU*{R>+2VXD&z8pSEeW;%Y{Rh2`{*&HL|3&B1f71o@4tgiOi~fh+O&8L8=)H6iT}7#TFeT=T9kJBgUlXM+@imsZls&&v-COoJbi&m$?KC^vOB$$UPcq?Pc4*`E%e$#ftcL7DXUB~hnsWX=i6 zJ%YoY;la=Qu%htvj?6hFN>3>Thl{+JBUkJ)j7G<+D5i`#=Iuv$H8?!P+QCgr!z`1> zlcXLQGgGe|WA*7TebvlTkKB3U9gTl99Pv{pzNj~OlN9XxmqUQ5Se@)3HvH$#Meq2W z0~h0tmJSI$J-VpJIE7dbv8w?PA=M*g+$K$B=e(tyEj#v6?BL`Asb_|Q1DROQpp$Nw zv`anAZ?KFvdS=C&)WcLoM$Zh3NT77NpqeB|6%~6%MXU{x_XynHH%M8yrAl`Y!`0PV=vr2O|FwtS z{_BS~V!1S|+>EMkH(XXm*FCb`AT3)4VKLq{HQADT-L* zk}kLrg+z(nmW(t8zns^J(2m%(@mwO;i$e#`O|=G|=|tDMGrb+IWe;@i+VxawI-~OL zG-ywqSl%NqmAA=crCX8Y`TT+-k;&=$B9X~ChxggDdgRNI6N;KU>{hDij+b197^hCGf~uESkTwCA+2|jfpK=V?wt>%ZuVGBGh_= zbnlE0)NmC-qqT2&yS@A=I6;4#$wgsI<)V3K;s)yC=B4WLxtGet@dHepANxF6HNAdt z*heat6_m*v#4oF9s^1{_^JHaB^<{na^57T%CeKe#FbI&Q4=D}W_}n9|6PTk;JQCdm#TA&~&oN5l;k!4zl&ueyG87q>CGlmS zE@bZh=(5~j>UDGXN$+5nPS}C9>cM6mbc@+8GDnz7MIrEF@%&7s`O2b4>y>5o@M6)k zO{KXp2kny6wp++TTjVH!SC-Yni$$B1O7qhpS|qP5D})mV?NKVujXD?@_S*TWwkMi| zmItTB`AB3-l!|jx60}23J2-*Fi)EEa#rbi|O6#@r%SbRR>$UUq+jn_b4Mh;OWkYmJ ztW5S*j8L}lR+dpzZ^)t@fMWKo*$6Y#+1F^Jn4yLua)tM&py<|=s%5C`=KIlEX}W(6 z&ZHvs$xwK&Oo~#UOdz+^G8jBYik*)dJLaiVyZzGT@7@+CmMJz1frD1S2}MD(LeVdA zvOGmm`>moZj8-UWzLVv|7}R>B8FWFcFwe%=`9&_1Z1B8f27L~zDeH?72DRJ?b1Vw_ z8CFxaOI9drw-e^YDId&MGcTQawK`{W!w#3es>urXk%F{RsbIC>iwq{4y^lUS--Yx; zdwRue@R0={(5vXSa z)+u&~rsuT4*Er1P624DPZhV8Hm|r$-F|%w$x-oZW0l4X5Q}3M1Wwp+HC$zUKojX=% z=BvYFGAXn3#p3HH>=X_&M=S&`ZZ|`VV_fttQRicrw^Ub4y~OtZSTs2&i0FPFSK-m* z9sR+N@6fpr9{OPq?#P+j?W?AGSHQ(*L zM|^x1(w=Rpj~}!Rf-bj4V9QD>vDK0ZxQgpLXm6kC+U1_{#^K6zFrTOr!w!~|pId?} zm_0NSGudS~%Lg-tM#Ie&Dwm%n5w4dp@Sh%J7v=me_cE(kD=9RPB`Xj8+ zx3hjqpU?L(x62Ku;PT45nF3BNaPxYILC)xLfh~t@7SDgz!_42MPFt|-1exm_I;Zq? zwpw4@V_lG~(8zO-vH3D33y*{|J%?c5ttssOPzN_JhVc0_ zV(<`iVa6?@);CaTiMZiTtBs%j@cjxVu{SxD*k*(YGAcGJQx(@DrV`sZWP&gjJ9@-E zL*dWK_M!Z#*i4d%#}(UDCzBjIR>Zkn`Sqdv3kQ>gTy}hj#p7Q-(ojf`eu^KY_4x7xL*OtCY$hn^MM19xiM%Td3`q=FD0^6FV?oh!# z-MxYBd_5eMPA^FY$^!jaCOLQgz4}PC0!k%=I2Lr;o-et zA?Ck!_aA9$+Xu&vhCB|TZb@@}%xWzoWuN6Y6pbej0=h8FnFE@Mb#ED>JF*iso& zbYlQ^{z9`jnHm=`ndK%YTz?`sil?t?#<6|5cTRhgtkafx=aQbbyjxFK%&gNsKb%X1 z^yS?6`ciJ4E~lJRhIQFveI>0g+t$~WDC6|y+BrqczD!$RSE8*GygFx{Q-*bA+4@Re zS&qew00xzFkHJv#U=~1$!tsAE3rGIpVa9sgYyi3$T9*5fWagv0S8SXgUU=2Zj_?b) z8QV9a{84@5$4AzeWj>G0sZDa#%XH==*TE-_5p$z)dw4}g?2RucRjq}RijNa3LGE!P z+88%%k9T^js9p-P-y+T%jYj|}4nHR>N8nR+C)eNpZTxk1_u2MYJ=Ll@@nqq`g|p`! zGkd{Y{N{hNt)t_ZIri5XF=~FjhnQxvavQeJlI>G(zRmM>!!?~HD~TD*xI3kg#RW$ppvkw_86;wO~n75 z^)DVj=r;~-8bUfZ9K0v}6T8+`ICWHj`NOFJG=`kHi*WXUlJq-?HcW-s$w@kt4g{&r z{8Xakhp2z{PsK$zG9djMgYEHz$@CYqqqK1`8P81~O*xs{(ZR~e7+p?q@CC9$|K*mG z9^>c#vvM-e2~|1yuyfd}Dkm+z|D(C52ZDb6`c)@&b!9V~n$EAI=dt`U^$G`RMDr_B zujacfQpHf!EB?pol`s8D?|WPczgv{AqshyIK-a?3H{Uf9x}s--$uTR0(S z_cy;^)O2Z|?+SasHx+z1ZHLz9ZN?Uq+%cN^6=NLZ7{fi@oTTXzI^RDMWS&lejXOC; z%$%^T<89*`%lO!q`(k{Nd$_aX3pctKW1MfRd{Al*MUL*`7&H6l1!dDE)i=ul=Ol3M zsyNeGdO^e;qbZ*q<|s56C`-#^@QkxOYzY95zWI`QOnyEd0j}LFSN{3}LECg*##)*2 zj#sQ+D8?7NcP}w~Zf%4h;*QbWyZNrO7u-A5NKddl6@H#7CusWabu7rgd;5cJcgN;d zbrfTYl*yM`Cbndx7}wGHRviGVUS_!53KR^_3#z8eVMl}VuR16bC6^xGFUZ!Qom4Hz z%PpH-OCyN5qi8AIgYo!PeO>UD?HBZ@y0%74&q#TAhdmU9W1!oYu6Oc)r#j>q%I#K zxLROWq>Y-&xv-uD1B~K^amT3Is0i1gk}G3aE4dC6T-k!yO0L5tS6l6xCb+T%v6Xfm zA-Rg%6)E%68CQp1v&$`M?eptM!Id$q`5sQht{I$5pU2fcyN(iE?X_zr=fd-AfowKf znuo6tTA7ROsQzYVSsQ>=cUAeiJ%HbL5S z{f_143d<^X@CiEZ7|p$l)$kKjHh=sqkH7gE5PQ_wp@A(Y4Ln) zFbjGZm|oABB2}Chn$eWXjs`0__5tS_$Ei+E<`E0Ws8||Ursj9odKP;ib0MZ!En8=q z{C-@uJFpmAWR1~D8MaJOY-xLZa>%DPL$uAhQ!;EVur89DZwUCzdURo4^SK$}dt-*L z1@=YWwN4HB)QWmx9(RnU&c)_n-;`l1Ze8r@eOk)rH>`7entyu7*xoGJ^mh36v7Mf> z>8G38Y~Mb%^#PmO%3q8v_Vhl(uw@Sl5R}|8nv&TOd7_pqV`ZQ++#f!6ny%ro)lwTQ zlRe{r8zFLZR2DUOf7=(&w~dy^9H1a*T53;E%A+>;2_o(&YERkosC_*=<`+?m8;l33 zbws@>PjP!9W7mC_haFoXjN*<_zxGIJV8`0c% z5sGoedRA}oT#W`OIQM9BF~)YLW8;T~Z~~F5qhgEn1gf45-ERMN2tn6;J&ufFZ}NQU zIVT0#BBf-&v$<1L3UWni+Mwt1XS4`1?ikfwi}a_4JQq6vh7&YjMj~wg;@Q}d8f{~% zNj9_3v=CeDeR|ll`EzmF##QHB=3tVxagA`U7Ubdl27LfEhP#<@@#BJoaZR@(F~+kp zj5#JY&)8tJUA zx_?a>(=(uif!r~w9BnWXqsExdWo*Gmc{okeEoZEC`8Ut$Pp>M(6?^M_tLH*5#UBbF z=$fw)k)Ff92YfB5ff2s*IG;MmKpzIsKKuS7;LB;STbiG53;5cdpa04E^n|oJ@T^#V zrkkqeo~Rk9e{bh}^29WiwFTGI#F+o9F|*3#g3PhGtMfUtKgOaZC8hcT%`mw0|P-z$sVr}uKEw%T+N zV^Zftwa=!DIa6_)8ua~40 zj99ch#@?+iH(Ywa#viLHOyiExsx8v|7O^VTNi8duVj4L zZF|jH7F#RxVb0Wo_oJTXXUz$<~Up7_sfMj*XoTU+lico|>Nv*s>34&ONHOBVyaw8T=U_B;#YQl1wM>JxO{MC*_MV6EWyzHpnBYbhwd*#)l|4wMm0VwuTy3@MtAZ>0 zkZGk|Uz1#IwQH;3$~KFwwCn4VtF3n3F1Xrze#JK=S7EziGxT?Gu13=lO+U+Gz3y)s zM*krcULsoiWcik1lAl=-blfqTmMZpS`L<=NY$@Y|IO?laMQ3$lZ?|_!Hv54XZqJLz z%g9XmcLF{v;|R@bx|GCn^Sg}Cf80ix#~nrQ-S_}t)QFpSmGa`F?$n0_Rxm~{=-$E))a?(tmWGf~0N1*b1sGJonB z{U@k+^i7w{*tprfp38nas}R%t1|!DPkdHsJOt~NCD#RKa1-j3&@~?ggvZl-B{05_2 z>Llr(r);9I6s`-AF@^h6&ivxiw1u%T-Cv|^Eg92|^;RA*T>g_@?cR&{%M4$p6Ww%P z#-0ifhJ0<^i}4f4!jz?IB-wNTsFr{Vv1TUi%&k z`LaVREw%6W8NT+~_jtf(K9ttJ`uB$nUwiF)BIHB;D>~~Kdpi6v!`EK>o(%a=|JrHa zpE7*yweP8rFMG6MOY7gCGknGEi@h~GZTa}8V++>4$f}ILq-^d~qJn*i*huPM9h?2? zZ85uIOn+lcEm)`4;Jr(o5A;mR)Pj~IX4BspQ+sWCHf3r->k+f*AB?HJHa(XzwV=g_ z+4MYPYJp9W_wN@R6Z^_@!8#RLQTR{GmVQIJeO#32Z?Tx~RkxyEMdrK{!ydYq{ii!MQcf&ke+$kULvG{?+kfY_a~^ zE|yJx)4U*G1?j8+w(T9TWrnX?YTG^`TU%}0H(<*Q zUbob?Ng-Qd+hR3fKgpIebluAOwtvXhR@)8;*oyaGV>vlFWNWK!2L^1}A?sG&w}V2q zw%T@Zz?L1ZZl!HgLbkTrc8Fxl8LDojZBs+Gw%T@Rz?OXpZl!I9g=}rL?eKstJIK^Z z+opwVZME%)fGs=N)Jof?hit`dYcSTS)|ebA+5GC;qVo%}RUb1vr#jB51@ET~)(NRE zmLDa!vI|C=y>l_UW^%6V1E=X;P;9;7D+E`2?V9De)bUisN1kGKy;5+s*RI)|tIg$b zj^JvqU2{2Co6F%m!ByO@SP!zpbGh$K75?f|WUOhvWK$nr3L3>`+m6^Chy|W4Jx;55 z%NRQ){OBCU7Tmwc%HD-p#uk*$n2pEeFt*pmS9wPMov>g6w&^E9tmM2p!EtOntwX0Kb6(3QH*|kh^6}KzWA79S7S}>Xxv+H=t z)mFPs5M1qTqgF_+w%T=~;L1L(TiN!$PI9%?t}ekMsT5iwb8D%lB=zDtrJ|uN6cdP>mTk%bTv8!};x#nntSHotXr?Iknnq}?8 zGOiZd*eZ1Z65Y2g+>R*w2C@7i*` zJ>@7e!`7d2^KukE;F>SH4f6RQ+}DcZ>@U^I=0kEtpEHqC^cKfSFu%d- zZuP~RGZ~-0osP7qjgco?m2s{_3s@PdmK)GEef0WJl5_P)y;>P4!_aVwr}^BCuny(3o|0w#e-aS=g8%>k diff --git a/win32/lib/glfw3.def b/win32/lib/glfw3.def deleted file mode 100644 index 8094484..0000000 --- a/win32/lib/glfw3.def +++ /dev/null @@ -1,86 +0,0 @@ -LIBRARY glfw3.dll - -EXPORTS -glfwCreateCursor -glfwCreateStandardCursor -glfwCreateWindow -glfwDefaultWindowHints -glfwDestroyCursor -glfwDestroyWindow -glfwExtensionSupported -glfwGetClipboardString -glfwGetCurrentContext -glfwGetCursorPos -glfwGetFramebufferSize -glfwGetGammaRamp -glfwGetInputMode -glfwGetJoystickAxes -glfwGetJoystickButtons -glfwGetJoystickName -glfwGetKey -glfwGetMonitorName -glfwGetMonitorPhysicalSize -glfwGetMonitorPos -glfwGetMonitors -glfwGetMouseButton -glfwGetPrimaryMonitor -glfwGetProcAddress -glfwGetTime -glfwGetVersion -glfwGetVersionString -glfwGetVideoMode -glfwGetVideoModes -glfwGetWGLContext -glfwGetWin32Adapter -glfwGetWin32Monitor -glfwGetWin32Window -glfwGetWindowAttrib -glfwGetWindowFrameSize -glfwGetWindowMonitor -glfwGetWindowPos -glfwGetWindowSize -glfwGetWindowUserPointer -glfwHideWindow -glfwIconifyWindow -glfwInit -glfwJoystickPresent -glfwMakeContextCurrent -glfwPollEvents -glfwPostEmptyEvent -glfwRestoreWindow -glfwSetCharCallback -glfwSetCharModsCallback -glfwSetClipboardString -glfwSetCursor -glfwSetCursorEnterCallback -glfwSetCursorPos -glfwSetCursorPosCallback -glfwSetDropCallback -glfwSetErrorCallback -glfwSetFramebufferSizeCallback -glfwSetGamma -glfwSetGammaRamp -glfwSetInputMode -glfwSetKeyCallback -glfwSetMonitorCallback -glfwSetMouseButtonCallback -glfwSetScrollCallback -glfwSetTime -glfwSetWindowCloseCallback -glfwSetWindowFocusCallback -glfwSetWindowIconifyCallback -glfwSetWindowPos -glfwSetWindowPosCallback -glfwSetWindowRefreshCallback -glfwSetWindowShouldClose -glfwSetWindowSize -glfwSetWindowSizeCallback -glfwSetWindowTitle -glfwSetWindowUserPointer -glfwShowWindow -glfwSwapBuffers -glfwSwapInterval -glfwTerminate -glfwWaitEvents -glfwWindowHint -glfwWindowShouldClose diff --git a/win32/lib/glfw3dll.a b/win32/lib/glfw3dll.a deleted file mode 100644 index dc593d062ac5b7f9d68e9bcea647d0d99a3910cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54834 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�l@P z+42w4eYYcs*B`}(UMWsB_%k;-vu1|ZQO*^sZ>~K01?1KODS9KM%}LeUA*zDNV9E?C zWRx!m(kF_KsiEV3X!8y@s7ZL46nHk_cquCqqQBp4)bC7WETwHuN>}Ir+D=4(>a|x# z;4fZCRYQkB>IzZgOkP^__A>lDiOwxNWhr+8oTcQ^XyjS36dsB-WKE%pO%*{y>&a{# z!4u~!dQ>ZI4~My7$NRkDFgNT8ZoC4Utghp(p!7L)9rpvJ+thX353J)hAN7Xol@=fB zSUy2}o)VLNy!U)Pe^Ax7JAz&5xyP2f!`!J*ejD8a%I+Vu_}pX82i-^x<##UYz<-Ap zCPv|ee2t?ICu~(yH5NcEO3*~qMakMa7PKfuTgS2&!4Ju%7Nz0%@19q|LSywBInkmq zf2^WrzxD`eTRbD4t%u@8Nu+qql1NWld=H&w(ypMj6nWGH1@?B6yq5A5UY7x1T%3-P zg69~;31w*>T#()Ul_AZugO0}8MZGOPsOH(D7Nms>QXx=ExF99i$y?T%XB+otdbJCC zPuz(;>xlE5jPjKs`VR;Ze&z^ObEB=-TWBi5$Ou~_O-*qZ_u6K8p*GkkI|)?$F)K4q zTN&3*6B*;EgKnhyQ$A~4KQm%$_HG5>Ny8xt!R>LuBRF+o)|Wl;AX>sBc_KVOWcW*Cg{SIl36E5X@BoqF zuZ|Uduo>P~9!gVI-jhNZ=;ya9XG0^_#@a}_HZuHUO7zAiQrX)dJrWL47HRbfY8N1+ z_)XJCkDvob`&FNel0=V@1uSOi+O8L1qeLa6uQ70f5xvdw0xyDclTJOV@vi6D+?+ps zB}mi}b5DtM$kTK1;`c%0Y<43&b)_ar*vXkO8YFBgBGehk&kO*K4u3lF8@+pi7v`4QSOwde;HD+4W^0k=}0(Fv9Kz z68`8j55nIJAQ9UgKq7751adLwML;4&DiH1FrzwR4We6Z4-; zYC*}jQ8Z9GY!oV8EzqeM>P1jo(3D9z2uc=GZBkBva?C~{BZw@dUHFM!*;@!Vnu(j& zziwr3g&BzjT?Ps1Lh@s-?2#K;92i#|1D?d`BtfZ-@)M4tv_?^Q@7c!ZBm_8TO37ciK4XHDA6m8a~sPW%IlWssWLb}Z4XuNwJceZ z9}ZPr7ZK`pTd4Q&WLt&Pt-2%6hSg0_Bgux@EEdspD|2HR%Wyf(VYYfG+9Qu%E2J)B z8hVIRxkU#v52&?s#Adn0$u!CzHF82lSshmOtY+||M(UE;wZkieo|-`Qq{@c6smUfMrIx3@LWtBRqH(&&nT}1z{sOz*wLX8~E0BO0h0GslZBuf`w1AEHD=-CwZ%| z)H$iZT+Tf85@`(4NiuVdRK_D!Wk!a?3K{Hfq)A%Hv>$U^u&@^IeMFX*;<~Cz|HPsq zJ=e(S07eVamyyv?tEm&Js%p!P91+2e8C)C%MEoo4$8$M)j%AtR6jd<7FRO4U5aw9=0`tY8CMot>R~sk2aepXb%P;L)*7 zc^qLN+lca-M2hVqj#%~VRZ9%lYDRvmSdJ$(tFU;abPq>urHC;BOF5S+p(|u4Q<*EZO*RYJHGaoC6UI!+}DCYfB0jpU~_gMWSBPPn$(Yaw}d^1Ea^C; zl^#YqAV^O=W+tYYQVYD##otX|{PKg{)8-f5gz$KdJ?h0`KE0xhu_TSUFck;76u)@6 z6zD36X#5~(7(VN0oJ2E$L|B^r2!B3_s({YJUlM@NyK?3W64Y4 z580!S)ByN256twyrwo9nM?7*Rf=cK$c7J8iF!os0g0F0)q{k0g_gTC85- zNl>X**oK^?i^|}?qgQYvp8NGUDPFqz+an`e0_#QoFz4476;AZEeTN^ zO{)i%Wdmst%HQ&%HNB=h@~i{~7;DDV%cQpwC)uiT!>_N=a4(cj%X?Uii1e1cvs1W7 zI-uj|Z;gS+!q|d#l@u1c@LH^QaZJlaD(9kw7z8BR0NQ5}h+0IVC-K=8Lx9rwgcIRP zCh`K!1EO(3lCoUV?gJ8Yv~yVSIebS2oeGMY!AI;Kr<^s)0wY`EsrR3Yj99jTs1tX=Yhfz-x}p zK?Hk2w7rTd-kThFo&MzwZo2Rz+qp6QjDB-RjULIK&33M4v?xO{+qq$)ovXM;DAIv8 z<=@fHQM-CSEty%a{@S@BT{goj`Qy=_x*hw^nc+EmX=zn68z}6X=aFaH9;IDyEa|_A zVHrK5mC}-!Ku;MlR$#^2D)@ulB5Pxs|u*X7wW53NO)hXypb9YCWVLc$8@9kJx6445fhjY2O95@kYJjOcjY{Xv9s>!mJRSGC=cNi zd>HNzA^#+Tbu}9!{che=C&xsKIK&X_dVeF@Wg~W$k`ej3>nyw}6ung||Us?ABp zW}$ZLu&!XbXta{Lf@Il^(#0>DxiQxYdv;0Z)nJ+&#wHJVYm?KEh$G|~d9)k~+Xkx! zgGAeNesH2MOpq5{5|}>pb!(*^LcU?N6@>46iyTJwW+IK81&9D0(Jnl?D71>rI_y-_ z_7c7N$kG~nQ0$IfA&n&`y}qfHZVMjGQiEwEfd27Pjh{#?G9A_iZ^JK6l)VR0aGQ&J zGGzts38N?+7~%CyeqWHHu)5!ZXTgtrF{^%jPL1{{0>XdO@^ckuh!)tuMJNezlMGNL zwB$*n42D?rRSkUd0gkL~N&_w3!Gj>P2g5aZBF@=-4xEE0VC`@zQlb?Pcs{2awU)~F^gCp9fkQJl@|h>>2i zUQNOak_q%xf>(_?hR5D?s*i>rW%Wj?c<`gF<|@_Y*#X?t<=I6y%(zLd%MNsTy77#b zXb;`!;A)7Q%ow}arih-s+Oh-JEZajh)6+fNgG!Owa|bLQjA&j?>is^Q6)c)Pk#)w$ zGxX}>A0qj6F^Qro0|9?wsfuo0~r_l?*7eK|x z7bKtCi@s81aR04E=p=SMdrl(b#g-%mqm>nF{pi^bXDY__Vrvv-8a^BO{c6%CD$4El zqO6@`FRgkZRj2LMrY9gf5>R%H5=);0pGIHv6@^x|H&{|ak)WcA-vcPEWH0C0Gu+eO zvk$wqh5*WHR1p?HS>1b|fnQGIqou+1AFa_pL;2G;Z?{nC65|J0wk4y~!{kC1Ry4m{ zX+*OGm;NdX*~FP=-Gd)}o(yeU3O@COd}Jp49=)41rLE?U%TS9tCmF3WnMvF=hZbE> z@l&{Y^WfzIhhlLs=W)c}g}xmNaWDd6rmz6=SjQ|{lPwlR5ju{Kr(@-gY=7vm12X)f zNMqP$fPD_>!;^}SQmLM!s^??T|H@1)J))K#L&WHpX>1`%z!BM)V8N2|mz(w@lxNhx z;BIS$;VezaBAR}Th|u=S@r;??BW8O4juhJV>W%TDk>4xA_$a$*SvjX@RgkjD?8CyI z10-u01=#MOc@9(JqB}R@fC50l(792t$j;43AQA( zPnYK~)3|0Gm6>1^A8@f=OeV^dXcf__P4Yf#;~+j@b31bG`hE^7YTr z_bkf5@u&^P1i)Sev}uR5WrwlAOT!cTP{UFdnwt*@kD(kAV@v?F)ubhuqLOY6RcNcZ z6pCS#KD@!umpG=P+z&(^pd^2~SB*pYLHP&afL5Bygi;I_h;T@olQx_UoN#Cd5e{pm z>BCQ`amK>3S^u!kf^`%U4ZHeEbU_pa*R-WG{hxJ4{-G^uk0^qF+E9)Q9IfUce@%Iq zeNaOCAkU zj8X{P`;cf>w81SDcDGvkw6pn9Kz$~fz++9GZ92CcLvKurU|Zk6r0;e0gW%3MaKNO{ zIpqVm&=Qv*Cs@gMGMS?7f+yMu5T4LsB>2ucA;PY=d1~b+F{1KqJ>v9*`WBznwCPc( z!{NUb5&F+vdC!#i{CLG*Wt8itO^=gv;9WAX_s4E8?tl*@kQ+#F@7;6?zx47yK20e6 zdY&ZjtHX1iZSbRRhi)9l)ZgKT66E;cwa;EVp-y`aV+M5< zy@jl=#H z0i5?yGZpM}Ih*TX_|#Ys>`TU%!O%C+eAT)7Lih>xr8=8i;Tr5qh&d~ou zJ=8ppLn^N0JwL?r%07DE(%DRB4LI*>X9|sroXx`_j`P0b_+8nz67f1i-{kOV8a2>D zRvI7idqGC#r}TK>iFc1z_9X*4o0p=mb*}CP&y{`WFl7}a#qo=!0*bwHW3c1Tr2zdz5dWKgl3s3TmOUy(k{+D`Twf>7VxO5EZr)IF*>vrF)At-N=2nxM1s&QiW(k) zpde`oz7S)`1EL{GClz@J-o#1;%Q7vF#&Kq38n2H_J4`p@=L1nN0fva$)3n;%*eH$I z4@$f?s4a@Nx&Ob`*}KlEQwj9<-Rb+y`My;Cv-a9+ul?RjaWZ=7^Uxj?cLQ9us2EGg19l~ryzPC6y# ztV>M9$0|w&*qWDR2O`VjziOYA_94TG63pZdH#JqK=kOu3EzJR6<;boKA2O7H4;fCi zAob`iC++){TbB#hu_hypSOlGdmmG$!mE{|*+nd8kOf#neq?IneGueZAiIyIE4aH_7 zve6Z}Cx=?Ui)?4j*`Ir!>|cN7zQ9^|ihlVG=0=$$T#v&i(i13pxj-2QS)W8-GX=Tm zlT<+l*%oAyZ9ztDT5F3kc8{!$gH?-j7nBJVeUg~*gc%<(uBh0eo+JudkLfZyC(%!? zWaOVcpK2bx-1MR;Mu}EajuLy*bk5rNA$+?;cc`*kFfQ!+D!1hWCY`3|QZ$F2^la7i z`~vCu9&!L&Xzf1$7tn}M>-W*RAyybqtuqm3OfYO=SEMm~68=nmk-Ew?_?DjIfg=Nu zrKH80!SpwYzl}UcL`8?7rRhnsT6%(_Uz_v^qF3tdPovS+EbZS{}bM;WS*V3 zy-44eyn%I23LWy{uPt$ZO+MOqAQBn_(>OkcJZb4UPE`J#VC@zMq^VzG)Q?TzTsv+A zMBPMvVhNCH${yF`qQ-6+PEoY=mC04BK`j{6I>bl-|Ej8)yXaWB61(LQf<0J+2=NYHR zs5~ksEp_I`x3j5n;$SZL#(@u+6h?ui?J7+;sEDD{?!uky6L%NBA-7OFrI&ZEx1u}5 z&EYH7&=WdL$n^~NDQM1G1le96WSERBMuw6k);~tK1`T1{ zyeFDE5-Zl^?@ly5!HUJJzA-j6S&_*45xE@&$L(qQ*!Xlu3YYw0WVz!o)68}Y7obow zjWpg!3f~Yr6uS)S!%O0Z;h6rosCfx`j0+emcv)45mNrvFdj*wzy$os13io9Sbb{&gBQBnH?-@Nj5PxMGI)b=M9 zvjQ3VkE5e&=wGbmcFX7Rj_)bgfGYWvBn^t-40a#!E%@{XL+F)v(1-H#Bot#iT13)i#2T-Y)UDaPZvh3l1+C5a*7HE+=V>=EHvPrsqqcPMMS zGYQTW5?y>wJj_pCEb_3~z_dADn2hl`Z)#WHm2-MrQW4yNiqs&_P6*Hd>%tWMgp5A9cYW0+%OI)iK5|LYWOXZ5aHD0pG}}5 z1bQ5m-alb4Ru;zL6>BbuIb79FeV`>~uzFqILdH<+F{qfBAenVCnge%cvB2I9XLcy4 z#Rwb4Uh2C<*43vZaOu5k{z1AMc%l!}>s;(sbTJk_RMAI%3q=>=^>87ln1e5Jz!r+V zjV#erMrtwrd!G{8$`-^l9Wpl*YULLNMn*5v$YFHvR~PYnhF!$U<&Ya)@%F$_tO4lr z!rf^576M&9?_FGf4Uk-kM05IoMYfKqI`@h6|T*o(~qG8baJV)f$D`;PKRLC zX(Ev7bSdl2jJ21~fLbGflLtSOBIHYDU2NjSjj8eJEG%v}z}@D=lMn?a>0Lk%Bv+#s zF$5+xvMs%gqNHV~c{{KxQTRlL?}Oww=zcPYV^Bs1hW2~>wNZ$zpX6a=sax)W-)JS2e!;C#@*AYGl$YcUC;^f+$!AbzB_-0o?614dmbmMa zrHHSm9hWw4R`R_=C`r#VHfBCq&V~;K0iXRXAH4yu9uK4R*zq-&Kd(2s2DN&UkfH5#a8^htRp8@p=Tm z`1dG&@ox=&y(%XpO!huFfms5dY%b7^A@=DjKQ@oFGGNAyA8GkejcR)mA|WI+HvHcC zj6u69GgBY$vblrH&1^4Z*N`)Jf=ON+)Q8AW>sGKPuFT&N`srO+IIRy_tmm$=xXX4@ z|7ce*x;-oO{3+3`SzUVvb?wVNVQ1+1+26?TU%K|?oUk)KHC`8pB)|tbhcV zG~n-QQCcVnBoObonbbLX@l6!~@zo3Yi`KJ)C#*Hbi5VQO$0u-3S%;RoF=;&Z5^*M{ zfMb8exT6!3=15N%0KsY|kVQ<@|r)*sw6k0CTQ`kk=q`701Os#-LOfyWMd=P`F$SSNZwOxod|l!V7ZD>1!Mj^T{p8kwfgTR`v|xI_`~;vf7HW zhKg``Q$u52Lk2k+&wC@p3^MJ$?gce<^UG?&3n3d?V)H+uRb4;74gqEIS67c)hf^H> zxHvjk7DikTpl3|eR9aP3`VXq(26hbe@Yf%Ias0L7FNQyy=AAfo(xl76!>3+5=iA{i zBQG6!38`n`k2$L6aq9sUCV*KCq6a-)e9eIwtpaKFOd4^k2d8};kyz@C6@s;2wxM> zIC1T?=tGN+Ll=ITxLydC^3fSQ2v0`CLe zA?OH@>O3|}Z~e^PnX2Ubfi&i{R;n@o*rGw0_)r>cg=%~wKp&_mXK)~}QfPyK?h!N*=mwzdKq*jMXc3?rg|-UlUZL%@uAcxUgw`K3!3~1W z1-egAzNKAZ(KMi&;0n7UK%)iS38dxVr$CnrZ4=N^k+Ks=)9(u)&8_SqCbtFxX^dt9 zX~|gtv`qXyY+YXiQti(g8VJmlFvbFDev|{Xi;sJOlspRv+CKrkx)XePfj2EW{v4A>qk%NluCugzE!u3+ejwHKv~x|JIU7jz z8)MNQf#!);XAcVmZV_|^P^q9LK(`7y<-7na^HcltfaVLDYf&6XQ~aNR#)#`vK;?qA zS=XIF+LQbls6t$iKi}lccY##D?*plnd6pIh`T>081v-F!DCpmSDn-gxpejM{0NpRH z`+yb*?K7Z-f`S*o3WlJ8K(`4x3+Q%1V}WV}6#!{DoeHFJE4L_OUGKECCxJAK7l9Uu zlx`p`bw3AEdAopA(+_~ORvfT=hkzD{-y=Y(RgZPe8*X$718GW*22#Gutm_o(I?K{- zv9uA%PnDP830 zCyoX9EdY0l!WvWWp)3YvO^%!AK~TK*rPqT}jCiEvybj8G59JS_6rAYh>4$Juc_=)q zz5egqJXe9jqlhWVw}P_MLs?FqZ@GCM0cDhj^6#Lm@=)FYrPD+CJtzk~6t2dFPjX8h z3QB>8ayclsdMG8Jtjcx!S_H~^59MA^4tgk0f>M04+gB$jJ3W*=pzyF5Q=>m39SHm% z`a0L`D+dnssO_l~q=Py1AZ=o=c@?7YnT;-!&@1xZFDEIg%kNPOj`6xg0QF!}=c~ry0KFW#c zJx-iJ|E>TKFSdE$@&-#FY!^X_E8r4D2siR`+bzB zeU#UHl;8U(M|_k47&Ulx9_*uB;-g&cqtK3^SI$x&VjEKkeZmWs8sUzK?Rq zL!rgCno5ow`7kd^7ga9uT7EkbBO$llfTnufL(9vi>t|J#M@CjRHk6GV>li8M{l0>} zZW%C!Sk%H6W=b(<>v|NiP_m^M%~GF-h3TL`_n!QcOg#Kk>Mh~4^aq=TQrvhWhgzkhtw5^N zY-gpxuuPhLeaWPvk)ut0FoK-oYuG&ZRa<4#LLl8NFl4+4g$a<(K<%~gUNYLLNbb6; z)&SKbZhB`0PMP$8FwjcsW@8zpverYdSIrCT#V8PgTe;#=1;yC|fY0yu7kLf~yBBUFHf?wIZd5sJIQrfYpTwT)4z#?$FbY zWe`g6e+(;Ah>xmZ2rP+VDgyK_~e z+elCCeh^3#})2IhfG6w6^@3%B83a5tr2%TdbKnHgT@Ut?fp< zRUI6Lm}VMM3lb&R5Vdrc)M;sTNtSxdn}dq$s%u@v+A5Ngp)~}(%=9`Gg_I1iYLY2E zWnvQ^{4tzdS*6@;Jlu*iL>TyNYH%gTEEvu#YpgVM8+R66u@=UX>lR`i(xOB9l?zX|)yA4QyI$rm5M`ne%V+P$$*ZFD1X54=bQ`X~e0r@Tyjd ztP)C`URQp5%D2+y)WUS9i#ihvv9_H|F&8eXk1S2mZPGCFOshJ%EK=r*cMS}TS~pi> zihf?3Nl0MJDN>jeY@GduOMSLSO{c-kQ;X850FHOl2AaFEGG3uIsSd{GmP8yc6Kcz9 zmM*LG5)n&l1U0SSL9o3!%_zIw$U)6)Kv8r2n*Plba4#l&CB9m5CNV{4(RyB^ktD9D zYmQ(S^W?HcxLelHd%tDOm3)qp-l!Y**^A5Sr_n0k9c48}YHfX!(*mTDTvR}-Q-}L@ zO&)@cH-)+1HAYkF&_%e(+JY4_95-1iD@sWD?Ov)F5Lbh~Zimc+N>}2z#;HQpU}w~^ zHami}==5s8R=iDasH=B}tC5n9rD|#5;_rPg?0$}B(`)qDv6m=+%BI(S_;$xa8lJ46 zdp3`hotR^J7yq|8vlMy2;Xv`N?ioGuWqJw%qdMKU1!m$Qt(knT8v{w>l+`-d%m`_a zm(il_`V4%ZZgn;rIeTtqzcd0d!8R|4jQdo!7MPtuEnj_v5C5hE(QSj~x@{E>r$t;$!S#Ac)uFm*#Z@|0q?Af>H&^!CzO}?|^ zokvGAOz!8rzF+*bgfJP|`(5E>4*gb$_6BSGu9862?enf6L)`WLJ2#KYibUG4?~mx_ zf1X%f0VdqcbU5+cM-r4oaFayW5gY$B@!Udkt@gVirk}=zJF$szQ=VO&sW|RIh?nLZ z$f{cP-mcHP`bDY{Zu?Ea#B)n1aws-`J}2q?+(CNx2JE~Uj^*%SV=8Xy;tp=tdCZ1) z2Cs_$=JT$sRA|jL>4e^R|j#xB$Q~shas-ka$|Dj3xujMNO!r< z9h&%3KN;g@jt=90zFNrQ9y;s+mCeD^-Sq{fs;??@6XyCeSD8*EW2P#@U3{!89bY3Z z?NLs9$79bDzr<^s6R{e^Br#;%*7!RsPLIF!)`92;!FvXW5<}Xr36ATEzaBqnc`^}W z(TwgL75!pVDE0Pc@5?}3G3btU0-?GFx;`8bJ%Zck zw&9(vRCnxEAXFeA7D3G80I^JQ=CM1*9N^4ccWf6BKwxoGqP2rT;I^Nd_Sr$yxemr) z`{Xlof{D}C_Cp@VPfE0t)>OTH^2s>?P_x|Bn}oVHCz0J=Z2d>_w@>buBiHunu3c~b z;N-72tiXZ4r-#6SpUIgTiVPm;(0@;e#cpi%{)|l&TfZ<Y-_>W7VDaE z#dp!7(%b5Ap(%zWX3f{V;>(rPOwYL>Vv*6cVmBUd1s)1_ebjp>OYpV^u?hyv{O>=K z2O28HJu+ax{ewSuVuTmxagPdE{4=ddyGH~FE;Em7G{DNzANIa7Juf&!C;}cVnx;Me zRkX~r>RYTo#{GS~d1h$LM?$YRuBJPf@vNa2<67C&$lSPMRBsq2EXj1ig>jwO6p7T; znlWq!@7LnCTffS^jxJBUc-%PmpfP0$7K6$BQKN7J?AUw`6M?@wW(@!5JGNs}qekwk z$(MBVj~Y9%%Zj7MX9sJ-vZVb@MvW*Yk7DPR`{`}exW>`V@RCnYChR8(Z4{3dxX&%d zx5&|h$9EzWIegHxhg-EN2Yjy0-WV7@dp?CcMpo=CAEbiOxY^C;JCbCOpVZE9(<|1X zg7I)b6HZwS=An`cP@facqfn>NfAM^|*FKeOjE}dCfIDs&1#k1_Ygqq6vDeVUKuPv9 zatdX*{?}uCDRpw=u?-N*=oEkhg938|A@(xpAR%C$^>2?A@uWy>84oN`V>@1bci?6vpY5zf^x&`>nKu!fITq1{ST)Y>;XLXBjU;< ztx);lOA$4UBkzzVYDu(Fp}~n@%SOryE~Q#S*Liz zz-gj(p<_^zIUWPN@puqYTQ)HrE`+2|Eb0q|23-1Q2!-@x3?;T78&(pUb&l@5A@9@- zQc2gFU^A+(dC)EQ7@rRBnj3|Z5w7e!-V+!~A&Rw>Lj2=+4T+SK3W!IRjo>Vh&*)w7 zRNQpx%7ToNDZ+_@TXF#8v-*&nb9BiRkwNm;DDLOjB~wHO$vobEZXc3!k1m-a zGDzl?q(l0UoOg7|6p=ylL6C>`AsM&s9xVqcB7@|QKo0jIdGOICQ$z;I`$0at56R)9 zOQwhnl79#Cus$RYJGx|w$RL^b(hlrH^6;ZerU*76Vl%+gFhx!_4PWH=?x`bKeLdpj zPS}$Xx~tMlwSLzT$*#v!>Dh+&5yYirZr(f%4J%r~ZY+#9Z@!u@kqU3XZzF&oX9$?| zV`~m018v-Lx~Gm|z^kIt+XdsL}Gz2ZU$kXrC<*S79_y&^0iS8^fnUfE+o_#KGyK)_(v; z^XBQ2POazRlM%y({2lo4ghm`Iw;(0^2hc&%2_{lsjlLReUiPg(2-fT-=H>TbP;x=@ z=9!YTL#_zs_77COQg(MFw<^Eqihg+8FzasQz~nDr;YH3o(&FT|nl~3qfUzqP`bKn7 z0bT`#%wLC4IhOB^tpy?vK8t}Q>+J{vm*^(uX2n;phfDOUpuEDY*9lNDzIqLauyG~K z@s20(mgpd3cdPU&4}@9tC^P<$5E2qpqJ#b%p1&6!>SB0APJCBvM`V!0^ALFA_jRzR zZ7=R0?d+FmXOe+qh$4sY{0GwbV0zKWxDH7Zf7vC&@q=hP)uX#rTuIP^@+_5NL9yBW z@MI*Dd<)0hIIat|Rx=$uJp4%Hgrl*y;M}3!HijvTr@M_qAw>lijkkzF@Y&ub6>58% zRHf~0Qf#)j&7kx4wrlmDl!fhWMfxVg$L(#B-x%DkLQc{OT^7z-wlRQE>+P5|-cRYs zwPun~LWcD0B<2#82$4+bsU@`?lGyBPbpT2|GRj#kDo0^4dReH2p&p1h9EqCc%iGQsUj0aJB0sa0-eg(@5+R^ZrFA$3icbs<}?Bl!kh@bPUs} zR9E!{{L-u?^of@&2{Zt}?Q)OH?T0?Aik z2SQtnpk&;EUqZ|;P!4Rv!FDUu$~6FOXM#ztW`OH=ZZ5WIq1M&H#bzj&d_XV@T`>6( zY^cD;^KKt(=R&QIa8^{>wqW07lV+)egJtu|W2?~~KPS3sbn8e2+q_xY(opP9BidE> z&Xh(`Oe;chw!Kc^P2)|a2(`+^;AxFwsP#=m)@e*#{z9!ALEqlS7CV^yiD0(u!Q^Nr zj!Y0pj{NFRctw`Js#(ez3jJ~y1+<)-?37tuG8d$ng)KENOxH)#T)m|u`5yBVYzWEB ziTFZHZUoa6{fhe|&)xvv6+yz-I+!rgTKo@T)@N3#M}RhRXYmFMxjj=KN_L=WLV5Ju_n7jprhUJfjf{KmM9q(ZW+fBdt^-WMppFzM%x>mM&(5638~Mbm_uLNGH)QC ztXVfN#eFZaXYiWenYfYm;|Dsvr6mrvehR0=jf3D2YThV=x|bjnUjtjCOS8}`Y{iQc zuyJT!`mF%DMVl9uyDM??u;Gchqhh=78q~Z|29;!y!J>!dnlZH9#U879qYOG>oL63i zRc!u*3b!P$5}JgdipH)4g>lW&xZ1ptxF$owF9X(4YZ8S;d?hahSuMTYn1c$`O1px| ziyTQ6872J(JnO2JTCzvV4A(r?{9|s~uQJ?#fn38tTqkX*AJU6?!GGF5r15Bd)M;ND z%W3uqM1hgb18`^ga;mLUHzUWx1E!x(Xnv`PIox!DwM^n{M0k)Lsc1wo&r^x^SNQ9d zXNTos>4DCan28Z%4RDL3UhK`LOKd|hGV!1&idN4Vm=8|#g|d!9oDoeaq4mb&X-<-^UNc0`n5*R zn&KSx)ajRnr<7q!Uj@y2)L{E-m)Lb%pWCb=7;Ys6ZsEjmJSKd(>o;*p6i!9b{ z@D5+e!pd+(1GarOge&SQ8^g7Ak#JdkePvmLmU6*CD#!|#g&Uiy zBW3epyrjN*No5T~SyUG3RgdB+lSPq6>|895AR-=LKK&ajBjMgy)59oNJ1(kj7&`!E zyP99`%34vk5nHXWXBT!~A`8Qf^_At-Rn^cZ&HLg7HCW^-ToS3QZN#ppM%^=Actc4b zv&)286RB4z{+BLls)VZ>p-QY$$Dc(TY+Uv1?6&#(p%bs^m;*DnBJoj((+8 zHBF5Rtrw)lBuRZ|Q{03IirxH1CI+0`d*V_lSIpvqozW;Q%3gg3`AvRJU@=)N_I7x^ zdZd~~%$qr3xgxibrD%RrB%C?P!qtu8rrNSQP;Hp)R=y+3Nzh{wWl}a>q|`Y_Ug7Lx z6XnXNba5GPc;yiC0{rDUEAU+3KNIgzox(7ynw=w%5{5InC6M?^#p<#8DS)!~khL{wL5V(DDMWT3QlF zwI7PT2#RI`Y27LV(mGuWbe_nI0kI{>4y*@Ktrp?^+akHaqH`emBB4#OD8ufZ1vREO zGFx}xCxkyfvZIDW>I@HKSByX55%(+c+w7st!dotqFvYU~lzI6=d2M zM9z_}^zZE+>B$}*`l8uh^I&L-XQ7YM=A&@dz&z^f1s~;2ALSz-rN4R>Q40TukHQhN zc@*-Z67wjW=cCkFirM|ed0~AF<%b?h<`b}wd3maEY|V%X7&)A~^Gg0tALU~oWdOe8 zQob(0TgE+FW(-w4&Dk_>FX{HVcm`b#cg9l_8INn2ZCJe?z%UFPz)h4fYx)i@_t4G> z-*~cP=GpokQCX43fN?d?I8CUiz}_+lHm3}yPIuzzO&+;eoJanqSI=)KYgpcC3*B*Wf{qGCA>1dB|{1%9R%>K5tTrmS)Faby-dIGMn~1D3rSDT~24{)#|#> z(3Z3m&!mNQI8HNVB6O>&Uf^UQk27hCn5