From 2067d5c18c3cea31c6db8d16753776486fea205b Mon Sep 17 00:00:00 2001 From: 0x01FE <0x01fe@0x01fe.net> Date: Sun, 9 Nov 2025 22:20:59 -0600 Subject: [PATCH] init --- .gitignore | 5 + CMakeLists.txt | 33 + include/GLFW/glfw3.h | 6547 +++++++++++++++++++++++++++++ include/GLFW/glfw3native.h | 663 +++ include/KHR/khrplatform.h | 311 ++ include/glad/glad.h | 2129 ++++++++++ src/glad.c | 1140 +++++ src/main.cpp | 157 + vendor/LICENSE.md | 23 + vendor/README.md | 70 + vendor/include/GLFW/glfw3.h | 6547 +++++++++++++++++++++++++++++ vendor/include/GLFW/glfw3native.h | 663 +++ vendor/lib-vc2022/glfw3.dll | Bin 0 -> 232448 bytes vendor/lib-vc2022/glfw3.lib | Bin 0 -> 706276 bytes vendor/lib-vc2022/glfw3_mt.lib | Bin 0 -> 706026 bytes vendor/lib-vc2022/glfw3dll.lib | Bin 0 -> 31378 bytes 16 files changed, 18288 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 include/GLFW/glfw3.h create mode 100644 include/GLFW/glfw3native.h create mode 100644 include/KHR/khrplatform.h create mode 100644 include/glad/glad.h create mode 100644 src/glad.c create mode 100644 src/main.cpp create mode 100644 vendor/LICENSE.md create mode 100644 vendor/README.md create mode 100644 vendor/include/GLFW/glfw3.h create mode 100644 vendor/include/GLFW/glfw3native.h create mode 100644 vendor/lib-vc2022/glfw3.dll create mode 100644 vendor/lib-vc2022/glfw3.lib create mode 100644 vendor/lib-vc2022/glfw3_mt.lib create mode 100644 vendor/lib-vc2022/glfw3dll.lib diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1488c57 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +glad.zip +*.bat + +build/ + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..4113341 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.10) +# I'm guessing your project name from the path, +# change "VoxelEngine" if it's wrong. +project(VoxelEngine) + +# Set C++ standard +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + +# --- Define the Executable --- +# Make sure to use your project name here. +add_executable(VoxelEngine + src/main.cpp + src/glad.c +) + +# --- Configure GLAD (from your src/ and include/ folders) --- +# This adds your local "include" folder (for glad.h) +target_include_directories(VoxelEngine PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +# --- Manually Configure GLFW --- + +# 1. Tell CMake where to find the GLFW header files (glfw3.h) +target_include_directories(VoxelEngine PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/vendor/include +) + +# 2. Tell CMake to link against the specific GLFW .lib file +target_link_libraries(VoxelEngine PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/vendor/lib-vc2022/glfw3.lib +) \ No newline at end of file diff --git a/include/GLFW/glfw3.h b/include/GLFW/glfw3.h new file mode 100644 index 0000000..9c55ac9 --- /dev/null +++ b/include/GLFW/glfw3.h @@ -0,0 +1,6547 @@ +/************************************************************************* + * GLFW 3.4 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2019 Camilla Löwy + * + * 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 + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * @brief Functions and types related to OpenGL and OpenGL ES contexts. + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan support reference + * @brief Functions and types related to Vulkan. + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * @brief Functions and types related to initialization and error handling. + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * @brief Functions and types related to input handling. + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * @brief Functions and types related to monitors. + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * @brief Functions and types related to windows. + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * 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 */ + +/* Include because most Windows GLU headers need wchar_t and + * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +#if defined(GLFW_INCLUDE_VULKAN) + #include +#endif /* Vulkan header */ + +/* The Vulkan header may have indirectly included windows.h (because of + * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. + */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GLFW_APIENTRY_DEFINED +#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 */ + +/* Include the chosen OpenGL or OpenGL ES headers. + */ +#if 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_ES32) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_GLCOREARB) + + #if defined(__APPLE__) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif /*GLFW_INCLUDE_GLEXT*/ + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#elif defined(GLFW_INCLUDE_GLU) + + #if defined(__APPLE__) + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) && \ + !defined(__gl_h_) && \ + !defined(__gles1_gl_h_) && \ + !defined(__gles2_gl2_h_) && \ + !defined(__gles2_gl3_h_) && \ + !defined(__gles2_gl31_h_) && \ + !defined(__gles2_gl32_h_) && \ + !defined(__gl_glcorearb_h_) && \ + !defined(__gl2_h_) /*legacy*/ && \ + !defined(__gl3_h_) /*legacy*/ && \ + !defined(__gl31_h_) /*legacy*/ && \ + !defined(__gl32_h_) /*legacy*/ && \ + !defined(__glcorearb_h_) /*legacy*/ && \ + !defined(__GL_H__) /*non-standard*/ && \ + !defined(__gltypes_h_) /*non-standard*/ && \ + !defined(__glee_h_) /*non-standard*/ + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#endif /* OpenGL and OpenGL ES headers */ + +#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 must 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 a GLFW Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Unix shared library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW header. + * + * The major version number of the GLFW header. 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 header. + * + * The minor version number of the GLFW header. This is incremented when + * features are added to the API but it remains backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 4 +/*! @brief The revision number of the GLFW header. + * + * The revision number of the GLFW header. This is incremented when a bug fix + * release is made that does not contain any API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 0 +/*! @} */ + +/*! @brief One. + * + * This is only semantic sugar for the number 1. You can instead use `1` or + * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal + * to one. + * + * @ingroup init + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * This is only semantic sugar for the number 0. You can instead use `0` or + * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is + * equal to zero. + * + * @ingroup init + */ +#define GLFW_FALSE 0 + +/*! @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 hat_state Joystick hat states + * @brief Joystick hat states. + * + * See [joystick hat input](@ref joystick_hat) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_HAT_CENTERED 0 +#define GLFW_HAT_UP 1 +#define GLFW_HAT_RIGHT 2 +#define GLFW_HAT_DOWN 4 +#define GLFW_HAT_LEFT 8 +#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) +#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) +#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) +#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) + +/*! @ingroup input + */ +#define GLFW_KEY_UNKNOWN -1 + +/*! @} */ + +/*! @defgroup keys Keyboard key tokens + * @brief Keyboard key tokens. + * + * 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 alphanumeric 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 + * @{ + */ + +/* 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 + * @brief 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. + * + * 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. + * + * 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. + * + * 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. + * + * If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 +/*! @brief If this bit is set the Caps Lock key is enabled. + * + * If this bit is set the Caps Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_CAPS_LOCK 0x0010 +/*! @brief If this bit is set the Num Lock key is enabled. + * + * If this bit is set the Num Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_NUM_LOCK 0x0020 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @brief Mouse button IDs. + * + * 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 + * @brief Joystick IDs. + * + * 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 gamepad_buttons Gamepad buttons + * @brief Gamepad buttons. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_BUTTON_A 0 +#define GLFW_GAMEPAD_BUTTON_B 1 +#define GLFW_GAMEPAD_BUTTON_X 2 +#define GLFW_GAMEPAD_BUTTON_Y 3 +#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 +#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 +#define GLFW_GAMEPAD_BUTTON_BACK 6 +#define GLFW_GAMEPAD_BUTTON_START 7 +#define GLFW_GAMEPAD_BUTTON_GUIDE 8 +#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 +#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 +#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 +#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 +#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT + +#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A +#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B +#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X +#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y +/*! @} */ + +/*! @defgroup gamepad_axes Gamepad axes + * @brief Gamepad axes. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_AXIS_LEFT_X 0 +#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 +#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 +#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 +#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER +/*! @} */ + +/*! @defgroup errors Error codes + * @brief Error codes. + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief No error has occurred. + * + * No error has occurred. + * + * @analysis Yay. + */ +#define GLFW_NO_ERROR 0 +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @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. + * + * @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 @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. + * + * @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. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @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 API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation API. + * 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 support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#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. + * + * @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. + * + * @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. + * + * @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 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @brief The specified cursor shape is not available. + * + * The specified standard cursor shape is not available, either because the + * current platform cursor theme does not provide it or because it is not + * available on the platform. + * + * @analysis Platform or system settings limitation. Pick another + * [standard cursor shape](@ref shapes) or create a + * [custom cursor](@ref cursor_custom). + */ +#define GLFW_CURSOR_UNAVAILABLE 0x0001000B +/*! @brief The requested feature is not provided by the platform. + * + * The requested feature is not provided by the platform, so GLFW is unable to + * implement it. The documentation for each function notes if it could emit + * this error. + * + * @analysis Platform or platform version limitation. The error can be ignored + * unless the feature is critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNAVAILABLE 0x0001000C +/*! @brief The requested feature is not implemented for the platform. + * + * The requested feature has not yet been implemented in GLFW for this platform. + * + * @analysis An incomplete implementation of GLFW for this platform, hopefully + * fixed in a future release. The error can be ignored unless the feature is + * critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNIMPLEMENTED 0x0001000D +/*! @brief Platform unavailable or no matching platform was found. + * + * If emitted during initialization, no matching platform was found. If the @ref + * GLFW_PLATFORM init hint was set to `GLFW_ANY_PLATFORM`, GLFW could not detect any of + * the platforms supported by this library binary, except for the Null platform. If the + * init hint was set to a specific platform, it is either not supported by this library + * binary or GLFW was not able to detect it. + * + * If emitted by a native access function, GLFW was initialized for a different platform + * than the function is for. + * + * @analysis Failure to detect any platform usually only happens on non-macOS Unix + * systems, either when no window system is running or the program was run from + * a terminal that does not have the necessary environment variables. Fall back to + * a different platform if possible or notify the user that no usable platform was + * detected. + * + * Failure to detect a specific platform may have the same cause as above or be because + * support for that platform was not compiled in. Call @ref glfwPlatformSupported to + * check whether a specific platform is supported by a library binary. + */ +#define GLFW_PLATFORM_UNAVAILABLE 0x0001000E +/*! @} */ + +/*! @addtogroup window + * @{ */ +/*! @brief Input focus window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUSED_hint) or + * [window attribute](@ref GLFW_FOCUSED_attrib). + */ +#define GLFW_FOCUSED 0x00020001 +/*! @brief Window iconification window attribute + * + * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). + */ +#define GLFW_ICONIFIED 0x00020002 +/*! @brief Window resize-ability window hint and attribute + * + * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and + * [window attribute](@ref GLFW_RESIZABLE_attrib). + */ +#define GLFW_RESIZABLE 0x00020003 +/*! @brief Window visibility window hint and attribute + * + * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and + * [window attribute](@ref GLFW_VISIBLE_attrib). + */ +#define GLFW_VISIBLE 0x00020004 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_DECORATED_hint) and + * [window attribute](@ref GLFW_DECORATED_attrib). + */ +#define GLFW_DECORATED 0x00020005 +/*! @brief Window auto-iconification window hint and attribute + * + * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and + * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). + */ +#define GLFW_AUTO_ICONIFY 0x00020006 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_FLOATING_hint) and + * [window attribute](@ref GLFW_FLOATING_attrib). + */ +#define GLFW_FLOATING 0x00020007 +/*! @brief Window maximization window hint and attribute + * + * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and + * [window attribute](@ref GLFW_MAXIMIZED_attrib). + */ +#define GLFW_MAXIMIZED 0x00020008 +/*! @brief Cursor centering window hint + * + * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). + */ +#define GLFW_CENTER_CURSOR 0x00020009 +/*! @brief Window framebuffer transparency hint and attribute + * + * Window framebuffer transparency + * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and + * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). + */ +#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A +/*! @brief Mouse cursor hover window attribute. + * + * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). + */ +#define GLFW_HOVERED 0x0002000B +/*! @brief Input focus on calling show window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or + * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). + */ +#define GLFW_FOCUS_ON_SHOW 0x0002000C + +/*! @brief Mouse input transparency window hint and attribute + * + * Mouse input transparency [window hint](@ref GLFW_MOUSE_PASSTHROUGH_hint) or + * [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib). + */ +#define GLFW_MOUSE_PASSTHROUGH 0x0002000D + +/*! @brief Initial position x-coordinate window hint. + * + * Initial position x-coordinate [window hint](@ref GLFW_POSITION_X). + */ +#define GLFW_POSITION_X 0x0002000E + +/*! @brief Initial position y-coordinate window hint. + * + * Initial position y-coordinate [window hint](@ref GLFW_POSITION_Y). + */ +#define GLFW_POSITION_Y 0x0002000F + +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). + */ +#define GLFW_RED_BITS 0x00021001 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). + */ +#define GLFW_GREEN_BITS 0x00021002 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). + */ +#define GLFW_BLUE_BITS 0x00021003 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). + */ +#define GLFW_ALPHA_BITS 0x00021004 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). + */ +#define GLFW_DEPTH_BITS 0x00021005 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). + */ +#define GLFW_STENCIL_BITS 0x00021006 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). + */ +#define GLFW_ACCUM_RED_BITS 0x00021007 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). + */ +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). + */ +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). + */ +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +/*! @brief Framebuffer auxiliary buffer hint. + * + * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). + */ +#define GLFW_AUX_BUFFERS 0x0002100B +/*! @brief OpenGL stereoscopic rendering hint. + * + * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). + */ +#define GLFW_STEREO 0x0002100C +/*! @brief Framebuffer MSAA samples hint. + * + * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). + */ +#define GLFW_SAMPLES 0x0002100D +/*! @brief Framebuffer sRGB hint. + * + * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). + */ +#define GLFW_SRGB_CAPABLE 0x0002100E +/*! @brief Monitor refresh rate hint. + * + * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). + */ +#define GLFW_REFRESH_RATE 0x0002100F +/*! @brief Framebuffer double buffering hint and attribute. + * + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER_hint) and + * [attribute](@ref GLFW_DOUBLEBUFFER_attrib). + */ +#define GLFW_DOUBLEBUFFER 0x00021010 + +/*! @brief Context client API hint and attribute. + * + * Context client API [hint](@ref GLFW_CLIENT_API_hint) and + * [attribute](@ref GLFW_CLIENT_API_attrib). + */ +#define GLFW_CLIENT_API 0x00022001 +/*! @brief Context client API major version hint and attribute. + * + * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +/*! @brief Context client API minor version hint and attribute. + * + * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +/*! @brief Context client API revision number attribute. + * + * Context client API revision number + * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). + */ +#define GLFW_CONTEXT_REVISION 0x00022004 +/*! @brief Context robustness hint and attribute. + * + * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) + * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). + */ +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +/*! @brief OpenGL forward-compatibility hint and attribute. + * + * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) + * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). + */ +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +/*! @brief Debug mode context hint and attribute. + * + * Debug mode context [hint](@ref GLFW_CONTEXT_DEBUG_hint) and + * [attribute](@ref GLFW_CONTEXT_DEBUG_attrib). + */ +#define GLFW_CONTEXT_DEBUG 0x00022007 +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_OPENGL_DEBUG_CONTEXT GLFW_CONTEXT_DEBUG +/*! @brief OpenGL profile hint and attribute. + * + * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and + * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). + */ +#define GLFW_OPENGL_PROFILE 0x00022008 +/*! @brief Context flush-on-release hint and attribute. + * + * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and + * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). + */ +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +/*! @brief Context error suppression hint and attribute. + * + * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and + * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). + */ +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +/*! @brief Context creation API hint and attribute. + * + * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and + * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). + */ +#define GLFW_CONTEXT_CREATION_API 0x0002200B +/*! @brief Window content area scaling window + * [window hint](@ref GLFW_SCALE_TO_MONITOR). + */ +#define GLFW_SCALE_TO_MONITOR 0x0002200C +/*! @brief Window framebuffer scaling + * [window hint](@ref GLFW_SCALE_FRAMEBUFFER_hint). + */ +#define GLFW_SCALE_FRAMEBUFFER 0x0002200D +/*! @brief Legacy name for compatibility. + * + * This is an alias for the + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for + * compatibility with earlier versions. + */ +#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). + */ +#define GLFW_COCOA_FRAME_NAME 0x00023002 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). + */ +#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_CLASS_NAME 0x00024001 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_INSTANCE_NAME 0x00024002 +#define GLFW_WIN32_KEYBOARD_MENU 0x00025001 +/*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint). + */ +#define GLFW_WIN32_SHOWDEFAULT 0x00025002 +/*! @brief Wayland specific + * [window hint](@ref GLFW_WAYLAND_APP_ID_hint). + * + * Allows specification of the Wayland app_id. + */ +#define GLFW_WAYLAND_APP_ID 0x00026001 +/*! @} */ + +#define GLFW_NO_API 0 +#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_LOCK_KEY_MODS 0x00033004 +#define GLFW_RAW_MOUSE_MOTION 0x00033005 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 +#define GLFW_CURSOR_CAPTURED 0x00034004 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 +#define GLFW_OSMESA_CONTEXT_API 0x00036003 + +#define GLFW_ANGLE_PLATFORM_TYPE_NONE 0x00037001 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGL 0x00037002 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGLES 0x00037003 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D9 0x00037004 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D11 0x00037005 +#define GLFW_ANGLE_PLATFORM_TYPE_VULKAN 0x00037007 +#define GLFW_ANGLE_PLATFORM_TYPE_METAL 0x00037008 + +#define GLFW_WAYLAND_PREFER_LIBDECOR 0x00038001 +#define GLFW_WAYLAND_DISABLE_LIBDECOR 0x00038002 + +#define GLFW_ANY_POSITION 0x80000000 + +/*! @defgroup shapes Standard cursor shapes + * @brief Standard system cursor shapes. + * + * These are the [standard cursor shapes](@ref cursor_standard) that can be + * requested from the platform (window system). + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor shape. + */ +#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 cursor shape. + * + * The crosshair cursor shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The pointing hand cursor shape. + * + * The pointing hand cursor shape. + */ +#define GLFW_POINTING_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize/move arrow shape. + * + * The horizontal resize/move arrow shape. This is usually a horizontal + * double-headed arrow. + */ +#define GLFW_RESIZE_EW_CURSOR 0x00036005 +/*! @brief The vertical resize/move arrow shape. + * + * The vertical resize/move shape. This is usually a vertical double-headed + * arrow. + */ +#define GLFW_RESIZE_NS_CURSOR 0x00036006 +/*! @brief The top-left to bottom-right diagonal resize/move arrow shape. + * + * The top-left to bottom-right diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NWSE_CURSOR 0x00036007 +/*! @brief The top-right to bottom-left diagonal resize/move arrow shape. + * + * The top-right to bottom-left diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NESW_CURSOR 0x00036008 +/*! @brief The omni-directional resize/move cursor shape. + * + * The omni-directional resize cursor/move shape. This is usually either + * a combined horizontal and vertical double-headed arrow or a grabbing hand. + */ +#define GLFW_RESIZE_ALL_CURSOR 0x00036009 +/*! @brief The operation-not-allowed shape. + * + * The operation-not-allowed shape. This is usually a circle with a diagonal + * line through it. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HRESIZE_CURSOR GLFW_RESIZE_EW_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_VRESIZE_CURSOR GLFW_RESIZE_NS_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HAND_CURSOR GLFW_POINTING_HAND_CURSOR +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +/*! @addtogroup init + * @{ */ +/*! @brief Joystick hat buttons init hint. + * + * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). + */ +#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 +/*! @brief ANGLE rendering backend init hint. + * + * ANGLE rendering backend [init hint](@ref GLFW_ANGLE_PLATFORM_TYPE_hint). + */ +#define GLFW_ANGLE_PLATFORM_TYPE 0x00050002 +/*! @brief Platform selection init hint. + * + * Platform selection [init hint](@ref GLFW_PLATFORM). + */ +#define GLFW_PLATFORM 0x00050003 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). + */ +#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). + */ +#define GLFW_COCOA_MENUBAR 0x00051002 +/*! @brief X11 specific init hint. + * + * X11 specific [init hint](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint). + */ +#define GLFW_X11_XCB_VULKAN_SURFACE 0x00052001 +/*! @brief Wayland specific init hint. + * + * Wayland specific [init hint](@ref GLFW_WAYLAND_LIBDECOR_hint). + */ +#define GLFW_WAYLAND_LIBDECOR 0x00053001 +/*! @} */ + +/*! @addtogroup init + * @{ */ +/*! @brief Hint value that enables automatic platform selection. + * + * Hint value for @ref GLFW_PLATFORM that enables automatic platform selection. + */ +#define GLFW_ANY_PLATFORM 0x00060000 +#define GLFW_PLATFORM_WIN32 0x00060001 +#define GLFW_PLATFORM_COCOA 0x00060002 +#define GLFW_PLATFORM_WAYLAND 0x00060003 +#define GLFW_PLATFORM_X11 0x00060004 +#define GLFW_PLATFORM_NULL 0x00060005 +/*! @} */ + +#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. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 3.0. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa @ref glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function pointer type for memory allocation callbacks. + * + * This is the function pointer type for memory allocation callbacks. A memory + * allocation callback function has the following signature: + * @code + * void* function_name(size_t size, void* user) + * @endcode + * + * This function must return either a memory block at least `size` bytes long, + * or `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `malloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The size will always be greater than zero. Allocations of size zero are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] size The minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated memory block, or `NULL` if an + * error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWallocatefun)(size_t size, void* user); + +/*! @brief The function pointer type for memory reallocation callbacks. + * + * This is the function pointer type for memory reallocation callbacks. + * A memory reallocation callback function has the following signature: + * @code + * void* function_name(void* block, size_t size, void* user) + * @endcode + * + * This function must return a memory block at least `size` bytes long, or + * `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `realloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The block address will never be `NULL` and the size will always be greater than zero. + * Reallocations of a block to size zero are converted into deallocations before reaching + * the custom allocator. Reallocations of `NULL` to a non-zero size are converted into + * regular allocations before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to reallocate. + * @param[in] size The new minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated or resized memory block, or + * `NULL` if an error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWreallocatefun)(void* block, size_t size, void* user); + +/*! @brief The function pointer type for memory deallocation callbacks. + * + * This is the function pointer type for memory deallocation callbacks. + * A memory deallocation callback function has the following signature: + * @code + * void function_name(void* block, void* user) + * @endcode + * + * This function may deallocate the specified memory block. This memory block + * will have been allocated with the same allocator. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * The block address will never be `NULL`. Deallocations of `NULL` are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to deallocate. + * @param[in] user The user-defined pointer from the allocator. + * + * @pointer_lifetime The specified memory block will not be accessed by GLFW + * after this function is called. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void (* GLFWdeallocatefun)(void* block, void* user); + +/*! @brief The function pointer type for error callbacks. + * + * This is the function pointer type for error callbacks. An error callback + * function has the following signature: + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * + * @param[in] error_code An [error code](@ref errors). Future releases may add + * more error codes. + * @param[in] description A UTF-8 encoded string describing the error. + * + * @pointer_lifetime The error description string is valid until the callback + * function returns. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int error_code, const char* description); + +/*! @brief The function pointer type for window position callbacks. + * + * This is the function pointer type for window position callbacks. A window + * position callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * + * @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 content area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); + +/*! @brief The function pointer type for window size callbacks. + * + * This is the function pointer type for window size callbacks. A window size + * callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @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 @ref window_size + * @sa @ref glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window close callbacks. + * + * This is the function pointer type for window close callbacks. A window + * close callback function has the following signature: + * @code + * void function_name(GLFWwindow* window) + * @endcode + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa @ref glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow* window); + +/*! @brief The function pointer type for window content refresh callbacks. + * + * This is the function pointer type for window content refresh callbacks. + * A window content refresh callback function has the following signature: + * @code + * void function_name(GLFWwindow* window); + * @endcode + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa @ref glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); + +/*! @brief The function pointer type for window focus callbacks. + * + * This is the function pointer type for window focus callbacks. A window + * focus callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa @ref glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); + +/*! @brief The function pointer type for window iconify callbacks. + * + * This is the function pointer type for window iconify callbacks. A window + * iconify callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa @ref glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); + +/*! @brief The function pointer type for window maximize callbacks. + * + * This is the function pointer type for window maximize callbacks. A window + * maximize callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * + * @param[in] window The window that was maximized or restored. + * @param[in] maximized `GLFW_TRUE` if the window was maximized, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_maximize + * @sa glfwSetWindowMaximizeCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); + +/*! @brief The function pointer type for framebuffer size callbacks. + * + * This is the function pointer type for framebuffer size callbacks. + * A framebuffer size callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @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 @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window content scale callbacks. + * + * This is the function pointer type for window content scale callbacks. + * A window content scale callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * + * @param[in] window The window whose content scale changed. + * @param[in] xscale The new x-axis content scale of the window. + * @param[in] yscale The new y-axis content scale of the window. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); + +/*! @brief The function pointer type for mouse button callbacks. + * + * This is the function pointer type for mouse button callback functions. + * A mouse button callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * + * @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`. Future releases + * may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa @ref glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); + +/*! @brief The function pointer type for cursor position callbacks. + * + * This is the function pointer type for cursor position callbacks. A cursor + * position callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the content area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * content area. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); + +/*! @brief The function pointer type for cursor enter/leave callbacks. + * + * This is the function pointer type for cursor enter/leave callbacks. + * A cursor enter/leave callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa @ref glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); + +/*! @brief The function pointer type for scroll callbacks. + * + * This is the function pointer type for scroll callbacks. A scroll callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * + * @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 @ref scrolling + * @sa @ref glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); + +/*! @brief The function pointer type for keyboard key callbacks. + * + * This is the function pointer type for keyboard key callbacks. A keyboard + * key callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * + * @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 platform-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future + * releases may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa @ref glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); + +/*! @brief The function pointer type for Unicode character callbacks. + * + * This is the function pointer type for Unicode character callbacks. + * A Unicode character callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa @ref glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); + +/*! @brief The function pointer type for Unicode character with modifiers + * callbacks. + * + * This is the function pointer type for Unicode character with modifiers + * callbacks. It is called for each input character, regardless of what + * modifier keys are held down. A Unicode character with modifiers callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * + * @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 @ref input_char + * @sa @ref glfwSetCharModsCallback + * + * @deprecated Scheduled for removal in version 4.0. + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); + +/*! @brief The function pointer type for path drop callbacks. + * + * This is the function pointer type for path drop callbacks. A path drop + * callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] path_count The number of dropped paths. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @pointer_lifetime The path array and its strings are valid until the + * callback function returns. + * + * @sa @ref path_drop + * @sa @ref glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); + +/*! @brief The function pointer type for monitor configuration callbacks. + * + * This is the function pointer type for monitor configuration callbacks. + * A monitor callback function has the following signature: + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref monitor_event + * @sa @ref glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); + +/*! @brief The function pointer type for joystick configuration callbacks. + * + * This is the function pointer type for joystick configuration callbacks. + * A joystick configuration callback function has the following signature: + * @code + * void function_name(int jid, int event) + * @endcode + * + * @param[in] jid The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref joystick_event + * @sa @ref glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int jid, int event); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * @sa @ref glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @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 @ref monitor_gamma + * @sa @ref glfwGetGammaRamp + * @sa @ref glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @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. + * + * This describes a single 2D image. See the documentation for each related + * function what the expected pixel format is. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + * + * @ingroup window + */ +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; + +/*! @brief Gamepad input state + * + * This describes the input state of a gamepad. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +typedef struct GLFWgamepadstate +{ + /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` + * or `GLFW_RELEASE`. + */ + unsigned char buttons[15]; + /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 + * to 1.0 inclusive. + */ + float axes[6]; +} GLFWgamepadstate; + +/*! @brief Custom heap memory allocator. + * + * This describes a custom heap memory allocator for GLFW. To set an allocator, pass it + * to @ref glfwInitAllocator before initializing the library. + * + * @sa @ref init_allocator + * @sa @ref glfwInitAllocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef struct GLFWallocator +{ + /*! The memory allocation function. See @ref GLFWallocatefun for details about + * allocation function. + */ + GLFWallocatefun allocate; + /*! The memory reallocation function. See @ref GLFWreallocatefun for details about + * reallocation function. + */ + GLFWreallocatefun reallocate; + /*! The memory deallocation function. See @ref GLFWdeallocatefun for details about + * deallocation function. + */ + GLFWdeallocatefun deallocate; + /*! The user pointer for this custom allocator. This value will be passed to the + * allocator functions. + */ + void* user; +} GLFWallocator; + + +/************************************************************************* + * 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 `GLFW_TRUE` immediately. + * + * The @ref GLFW_PLATFORM init hint controls which platforms are considered during + * initialization. This also depends on which platforms the library was compiled to + * support. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos 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 the @ref + * GLFW_COCOA_CHDIR_RESOURCES init hint. + * + * @remark @macos This function will create the main menu and dock icon for the + * application. If GLFW finds a `MainMenu.nib` it is loaded and assumed to + * contain a menu bar. Otherwise a minimal menu bar is created manually 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 + * and dock icon can be disabled entirely with the @ref GLFW_COCOA_MENUBAR init + * hint. + * + * @remark __Wayland, X11:__ If the library was compiled with support for both + * Wayland and X11, and the @ref GLFW_PLATFORM init hint is set to + * `GLFW_ANY_PLATFORM`, the `XDG_SESSION_TYPE` environment variable affects + * which platform is picked. If the environment variable is not set, or is set + * to something other than `wayland` or `x11`, the regular detection mechanism + * will be used instead. + * + * @remark @x11 This function will set the `LC_CTYPE` category of the + * application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInitHint + * @sa @ref glfwInitAllocator + * @sa @ref glfwTerminate + * + * @since Added in version 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. + * + * This function has no effect if GLFW is not initialized. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Sets the specified init hint to the desired value. + * + * This function sets hints for the next initialization of GLFW. + * + * The values you set hints to are never reset by GLFW, but they only take + * effect during initialization. Once GLFW has been initialized, any values + * you set will be ignored until the library is terminated and initialized + * again. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [init hint](@ref init_hints) to set. + * @param[in] value The new value of the init hint. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref + * GLFW_INVALID_VALUE. + * + * @remarks This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa init_hints + * @sa glfwInit + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI void glfwInitHint(int hint, int value); + +/*! @brief Sets the init allocator to the desired value. + * + * To use the default allocator, call this function with a `NULL` argument. + * + * If you specify an allocator struct, every member must be a valid function + * pointer. If any member is `NULL`, this function will emit @ref + * GLFW_INVALID_VALUE and the init allocator will be unchanged. + * + * The functions in the allocator must fulfil a number of requirements. See the + * documentation for @ref GLFWallocatefun, @ref GLFWreallocatefun and @ref + * GLFWdeallocatefun for details. + * + * @param[in] allocator The allocator to use at the next initialization, or + * `NULL` to use the default one. + * + * @errors Possible errors include @ref GLFW_INVALID_VALUE. + * + * @pointer_lifetime The specified allocator is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref init_allocator + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitAllocator(const GLFWallocator* allocator); + +#if defined(VK_VERSION_1_0) + +/*! @brief Sets the desired Vulkan `vkGetInstanceProcAddr` function. + * + * This function sets the `vkGetInstanceProcAddr` function that GLFW will use for all + * Vulkan related entry point queries. + * + * This feature is mostly useful on macOS, if your copy of the Vulkan loader is in + * a location where GLFW cannot find it through dynamic loading, or if you are still + * using the static library version of the loader. + * + * If set to `NULL`, GLFW will try to load the Vulkan loader dynamically by its standard + * name and get this function from there. This is the default behavior. + * + * The standard name of the loader is `vulkan-1.dll` on Windows, `libvulkan.so.1` on + * Linux and other Unix-like systems and `libvulkan.1.dylib` on macOS. If your code is + * also loading it via these names then you probably don't need to use this function. + * + * The function address you set is never reset by GLFW, but it only takes effect during + * initialization. Once GLFW has been initialized, any updates will be ignored until the + * library is terminated and initialized again. + * + * @param[in] loader The address of the function to use, or `NULL`. + * + * @par Loader function signature + * @code + * PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance instance, const char* name) + * @endcode + * For more information about this function, see the + * [Vulkan Registry](https://www.khronos.org/registry/vulkan/). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref vulkan_loader + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitVulkanLoader(PFN_vkGetInstanceProcAddr loader); + +#endif /*VK_VERSION_1_0*/ + +/*! @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`. + * + * @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`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersionString + * + * @since Added in version 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, platforms, compiler and any platform or operating system specific + * compile-time options. It should not be confused with the OpenGL or OpenGL ES version + * string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * __Do not use the version string__ to parse what platforms are supported. The @ref + * glfwPlatformSupported function lets you query platform support. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Returns and clears the last error for the calling thread. + * + * This function returns and clears the [error code](@ref errors) of the last + * error that occurred on the calling thread, and optionally a UTF-8 encoded + * human-readable description of it. If no error has occurred since the last + * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is + * set to `NULL`. + * + * @param[in] description Where to store the error description pointer, or `NULL`. + * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR + * (zero). + * + * @errors None. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * next error occurs or the library is terminated. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI int glfwGetError(const char** description); + +/*! @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 code is set before the callback is called. Calling @ref + * glfwGetError from the error callback will return the same value as the error + * code argument. + * + * 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] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @callback_signature + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * For more information about the callback parameters, see the + * [callback pointer type](@ref GLFWerrorfun). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * @sa @ref glfwGetError + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); + +/*! @brief Returns the currently selected platform. + * + * This function returns the platform that was selected during initialization. The + * returned value will be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @return The currently selected platform, or zero if an error occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwPlatformSupported + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwGetPlatform(void); + +/*! @brief Returns whether the library includes support for the specified platform. + * + * This function returns whether the library was compiled with support for the specified + * platform. The platform must be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @param[in] platform The platform to query. + * @return `GLFW_TRUE` if the platform is supported, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwGetPlatform + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwPlatformSupported(int platform); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @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 no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa @ref glfwGetPrimaryMonitor + * + * @since Added in version 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 task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa @ref glfwGetMonitors + * + * @since Added in version 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Retrieves the work area of the monitor. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the + * monitor not occluded by the window system task bar where present. If no + * task bar exists then the work area is the monitor resolution in screen + * coordinates. + * + * Any or all of the position and size arguments may be `NULL`. If an error + * occurs, all non-`NULL` position and size 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`. + * @param[out] width Where to store the monitor width, or `NULL`. + * @param[out] height Where to store the monitor height, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_workarea + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some platforms do not provide accurate monitor size information, either + * because the monitor [EDID][] data is incorrect or because the driver does + * not report it accurately. + * + * [EDID]: https://en.wikipedia.org/wiki/Extended_display_identification_data + * + * 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 On Windows 8 and earlier the physical size is calculated from + * the current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Retrieves the content scale for the specified monitor. + * + * This function retrieves the content scale for the specified monitor. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * The content scale may depend on both the monitor resolution and pixel + * density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution. + * + * @param[in] monitor The monitor to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Fractional scaling information is not yet available for + * monitors, so this function only returns integer content scales. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the user pointer of the specified monitor. + * + * This function sets the user-defined pointer of the specified monitor. The + * current value is retained until the monitor is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwGetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); + +/*! @brief Returns the user pointer of the specified monitor. + * + * This function returns the current value of the user-defined pointer of the + * specified monitor. The initial value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwSetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void* glfwGetMonitorUserPointer(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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmonitorfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); + +/*! @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), then by resolution area (the + * product of width and height), then resolution width and finally by refresh + * rate. + * + * @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoModes + * + * @since Added in version 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 an appropriately sized gamma ramp from the specified + * exponent and then calls @ref glfwSetGammaRamp with it. The value must be + * a finite number greater than zero. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_INVALID_VALUE, + * @ref GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE while + * returning `NULL`. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark The size of the specified gamma ramp should match the size of the + * current ramp for that monitor. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwWindowHintString + * + * @since Added in version 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 this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only integer value hints can be set with this function. String value hints + * are set with @ref glfwWindowHintString. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHintString + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @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 this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only string type hints can be set with this function. Integer value hints + * are set with @ref glfwWindowHint. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintString(int hint, const char* value); + +/*! @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, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * 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 is not + * iconified, 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. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. This will not affect its + * OpenGL or OpenGL ES context. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, set the @ref + * GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints before creation. To + * restore the default behavior, set either or both hints back to + * `GLFW_ANY_POSITION`. + * + * As long as at least one full screen window is not iconified, 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` for + * 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_APPLICATION` icon will be used instead. To set a different icon, + * see @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @macos The OS only supports core profile contexts for OpenGL + * versions 3.2 and later. Before creating an OpenGL context of version 3.2 or + * later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) + * hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all + * on macOS. + * + * @remark @macos 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][bundle-guide] in the Mac Developer Library. + * + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ + * + * @remark @macos On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) + * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the + * application bundle's `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X][hidpi-guide] in the Mac Developer + * Library. The GLFW test and example programs use a custom `Info.plist` + * template for this, which can be found as `CMake/Info.plist.in` in the source + * tree. + * + * [hidpi-guide]: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html + * + * @remark @macos When activating frame autosaving with + * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified + * window size and position may be overridden by previously saved values. + * + * @remark @wayland GLFW uses [libdecor][] where available to create its window + * decorations. This in turn uses server-side XDG decorations where available + * and provides high quality client-side decorations on compositors like GNOME. + * If both XDG decorations and libdecor are unavailable, GLFW falls back to + * a very simple set of window decorations that only support moving, resizing + * and the window manager's right-click menu. + * + * [libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @remark @x11 The class part of the `WM_CLASS` window property will by + * default be set to the window title passed to this function. The instance + * part will use the contents of the `RESOURCE_NAME` environment variable, if + * present and not empty, or fall back to the window title. Set the + * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and + * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to + * override this. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwDestroyWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwCreateWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Returns the title of the specified window. + * + * This function returns the window title, encoded as UTF-8, of the specified + * window. This is the title set previously by @ref glfwCreateWindow + * or @ref glfwSetWindowTitle. + * + * @param[in] window The window to query. + * @return The UTF-8 encoded window title, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The returned title is currently a copy of the title last set by @ref + * glfwCreateWindow or @ref glfwSetWindowTitle. It does not include any + * additional text which may be appended by the platform or another program. + * + * @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 + * glfwGetWindowTitle or @ref glfwSetWindowTitle, or until the library is + * terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * @sa @ref glfwSetWindowTitle + * + * @since Added in version 3.4. + * + * @ingroup window + */ +GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* window); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * @sa @ref glfwGetWindowTitle + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @macos Regular windows do not have icons on macOS. This function + * will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide][bundle-guide] in the Mac Developer Library. + * + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ + * + * @remark @wayland There is no existing protocol to change an icon, the + * window will thus inherit the one defined in the application's desktop file. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the content area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the content 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 content area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way for an application to retrieve the global + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the content area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the content 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 content area. + * @param[in] ypos The y-coordinate of the upper-left corner of the content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way for an application to set the global + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the content area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the content 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 + * content area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the content area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The size limits will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the content area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The aspect ratio will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the content area of the specified window. + * + * This function sets the size, in screen coordinates, of the content area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * 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, in screen coordinates, of the window + * content area. + * @param[in] height The desired height, in screen coordinates, of the window + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwGetWindowSize + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Retrieves the content scale for the specified window. + * + * This function retrieves the content scale for the specified window. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * On platforms where each monitors can have its own content scale, the window + * content scale will depend on which monitor the system considers the window + * to be on. + * + * @param[in] window The window to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * @sa @ref glfwGetMonitorContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); + +/*! @brief Returns the opacity of the whole window. + * + * This function returns the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one. + * + * The initial opacity value for newly created windows is one. + * + * @param[in] window The window to query. + * @return The opacity value of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwSetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); + +/*! @brief Sets the opacity of the whole window. + * + * This function sets the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. + * + * The initial opacity value for newly created windows is one. + * + * A window created with framebuffer transparency may not use whole window + * transparency. The results of doing this are undefined. + * + * @param[in] window The window to set the opacity for. + * @param[in] opacity The desired opacity of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way to set an opacity factor for a window. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwGetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); + +/*! @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, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Once a window is iconified, @ref glfwRestoreWindow won’t + * be able to restore it. This is a design decision of the xdg-shell + * protocol. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwRestoreWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 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) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(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. + * + * By default, windowed mode windows are focused when shown + * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint + * to change this behavior for all newly created windows, or change the + * behavior for an existing window with @ref glfwSetWindowAttrib. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Because Wayland wants every frame of the desktop to be + * complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is + * updated after this call. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwHideWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to + * disable this behavior. + * + * Also by default, windowed mode windows are focused when shown + * with @ref glfwShowWindow. Set the + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * For a less disruptive way of getting the user's attention, see + * [attention requests](@ref window_attention). + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland The compositor will likely ignore focus requests unless + * another window created by the same application already has input focus. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * @sa @ref window_attention + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Requests user attention to the specified window. + * + * This function requests user attention to the specified window. On + * platforms where this is not supported, attention is requested to the + * application as a whole. + * + * Once the user has given attention, usually by focusing the window or + * application, the system will end the request automatically. + * + * @param[in] window The window to request attention to. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos Attention is requested to the application as a whole, not the + * specific window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attention + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwRequestWindowAttention(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](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window content area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * content area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * content area. + * @param[in] width The desired with, in screen coordinates, of the content + * area or video mode. + * @param[in] height The desired height, in screen coordinates, of the content + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise + * affected by any resizing or mode switching, although you may need to update + * your viewport if the framebuffer size has changed. + * + * @remark @wayland The desired window position is ignored, as there is no way + * for an application to set this property. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa @ref glfwGetWindowMonitor + * @sa @ref glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwSetWindowAttrib + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets an attribute of the specified window. + * + * This function sets the value of an attribute of the specified window. + * + * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), + * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), + * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), + * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_attrib) + * + * Some of these attributes are ignored for full screen windows. The new + * value will take effect if the window is later made windowed. + * + * Some of these attributes are ignored for windowed mode windows. The new + * value will take effect if the window is later made full screen. + * + * @param[in] window The window to set the attribute for. + * @param[in] attrib A supported window attribute. + * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark Calling @ref glfwGetWindowAttrib will always return the latest + * value, even if that value is ignored by the current mode of the window. + * + * @remark @wayland The [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) window attribute is + * not supported. Setting this will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwGetWindowAttrib + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwGetWindowUserPointer + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwSetWindowUserPointer + * + * @since Added in version 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 + * position, in screen coordinates, of the upper-left corner of the content + * area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland This callback will never be called, as there is no way for + * an application to know its global position. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/*! @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 content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowsizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowclosefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @macos Selecting Quit from the application menu will trigger the + * close callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the content 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, Aqua or Wayland, 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowrefreshfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowfocusfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowiconifyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/*! @brief Sets the maximize callback for the specified window. + * + * This function sets the maximization callback of the specified window, which + * is called when the window is maximized or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowmaximizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_maximize + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWframebuffersizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/*! @brief Sets the window content scale callback for the specified window. + * + * This function sets the window content scale callback of the specified window, + * which is called when the content scale of the specified window changes. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowcontentscalefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/*! @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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout 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, or until the specified timeout is reached. If + * 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. + * + * The timeout value must be a positive finite number. + * + * 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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @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 or @ref glfwWaitEventsTimeout to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 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 @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwSetInputMode + * + * @since Added in version 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 @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * 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 + * content 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. + * - `GLFW_CURSOR_CAPTURED` makes the cursor visible and confines it to the + * content area of the window. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_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 + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_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. + * + * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to + * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, + * callbacks that receive modifier bits will also have the @ref + * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, + * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. + * + * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` + * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is + * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, + * attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref + * glfwRawMouseMotionSupported to check for support. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see above). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns whether raw mouse motion is supported. + * + * This function returns whether raw mouse motion is supported on the current + * system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on + * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. + * + * Raw mouse motion is closer to the actual motion of the mouse across + * a surface. It is not affected by the scaling and acceleration applied to + * the motion of the desktop cursor. That processing is suitable for a cursor + * while raw motion is better for controlling for example a 3D camera. Because + * of this, raw mouse motion is only provided when the cursor is disabled. + * + * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref raw_mouse_motion + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwRawMouseMotionSupported(void); + +/*! @brief Returns the layout-specific name of the specified printable key. + * + * This function returns the name of the specified printable key, encoded as + * UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead + * keys, it is typically the diacritic it would add to a character. + * + * __Do not use this function__ for [text input](@ref input_char). You will + * break text input for many languages even if it happens to work for yours. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, + * otherwise the scancode is ignored. If you specify a non-printable key, or + * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this + * function returns `NULL` but does not emit an error. + * + * This behavior allows you to always pass in the arguments in the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * Names for printable keys depend on keyboard layout, while names for + * non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text. + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark The contents of the returned string may change when a keyboard + * layout change event is received. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the platform-specific scancode of the specified key. + * + * This function returns the platform-specific scancode of the specified key. + * + * If the specified [key token](@ref keys) corresponds to a physical key not + * supported on the current platform then this method will return `-1`. + * Calling this function with anything other than a key token will return `-1` + * and generate a @ref GLFW_INVALID_ENUM error. + * + * @param[in] key Any [key token](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if the key is + * not supported on the current platform or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref input_key + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetKeyScancode(int key); + +/*! @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 action `GLFW_REPEAT` is only reported to the key callback. + * + * If the @ref 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. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 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 @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function + * returns `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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the content area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the content 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 content area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPos + * + * @since Added in version 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 content area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the content 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 + * content area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland This function will only work when the cursor mode is + * `GLFW_CURSOR_DISABLED`, otherwise it will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwGetCursorPos + * + * @since Added in version 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, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwDestroyCursor + * @sa @ref glfwCreateStandardCursor + * + * @since Added in version 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, that can be set for a window with + * @ref glfwSetCursor. The images for these cursors come from the system + * cursor theme and their exact appearance will vary between platforms. + * + * Most of these shapes are guaranteed to exist on every supported platform but + * a few may not be present. See the table below for details. + * + * Cursor shape | Windows | macOS | X11 | Wayland + * ------------------------------ | ------- | ----- | ------ | ------- + * @ref GLFW_ARROW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_IBEAM_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_CROSSHAIR_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_POINTING_HAND_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_EW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NS_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NWSE_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_NESW_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_ALL_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_NOT_ALLOWED_CURSOR | Yes | Yes | Maybe2 | Maybe2 + * + * 1) This uses a private system API and may fail in the future. + * + * 2) This uses a newer standard that not all cursor themes support. + * + * If the requested shape is not available, this function emits a @ref + * GLFW_CURSOR_UNAVAILABLE error and returns `NULL`. + * + * @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_CURSOR_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_standard + * @sa @ref glfwCreateCursor + * + * @since Added in version 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. + * + * If the specified cursor is current for any window, that window will be + * reverted to the default cursor. This does not affect the cursor mode. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 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 + * content 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 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 with associated key tokens. 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWkeyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); + +/*! @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 macOS or Alt key + * on Windows. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); + +/*! @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] callback 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](@ref error_handling) occurred. + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharmodsfun). + * + * @deprecated Scheduled for removal in version 4.0. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmousebuttonfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); + +/*! @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 + * content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); + +/*! @brief Sets the cursor enter/leave callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the content area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorenterfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWscrollfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); + +/*! @brief Sets the path drop callback. + * + * This function sets the path drop callback of the specified window, which is + * called when one or more dragged paths 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWdropfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * There is no need to call this function before other functions that accept + * a joystick ID, as they all check for presence before performing any other + * work. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int jid); + +/*! @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. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid 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 the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int jid, 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`. + * + * For backward compatibility with earlier versions that did not have @ref + * glfwGetJoystickHats, the button array also includes all hats, each + * represented as four buttons. The hats are in the same order as returned by + * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and + * _left_. To disable these extra buttons, set the @ref + * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid 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 the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); + +/*! @brief Returns the state of all hats of the specified joystick. + * + * This function returns the state of all hats of the specified joystick. + * Each element in the array is one of the following values: + * + * Name | Value + * ---- | ----- + * `GLFW_HAT_CENTERED` | 0 + * `GLFW_HAT_UP` | 1 + * `GLFW_HAT_RIGHT` | 2 + * `GLFW_HAT_DOWN` | 4 + * `GLFW_HAT_LEFT` | 8 + * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` + * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` + * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` + * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` + * + * The diagonal directions are bitwise combinations of the primary (up, right, + * down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction. + * + * @code + * if (hats[2] & GLFW_HAT_RIGHT) + * { + * // State of hat 2 could be right-up, right or right-down + * } + * @endcode + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of hat states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of hat states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_hat + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, 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. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int jid); + +/*! @brief Returns the SDL compatible GUID of the specified joystick. + * + * This function returns the SDL compatible GUID, as a UTF-8 encoded + * hexadecimal string, of the specified joystick. The returned string is + * allocated and freed by GLFW. You should not free it yourself. + * + * The GUID is what connects a joystick to a gamepad mapping. A connected + * joystick will always have a GUID even if there is no gamepad mapping + * assigned to it. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to + * uniquely identify the make and model of a joystick but does not identify + * a specific unit, e.g. all wired Xbox 360 controllers will have the same + * GUID on that platform. The GUID for a unit may vary between platforms + * depending on what hardware information the platform specific APIs provide. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickGUID(int jid); + +/*! @brief Sets the user pointer of the specified joystick. + * + * This function sets the user-defined pointer of the specified joystick. The + * current value is retained until the joystick is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwGetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); + +/*! @brief Returns the user pointer of the specified joystick. + * + * This function returns the current value of the user-defined pointer of the + * specified joystick. The initial value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwSetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void* glfwGetJoystickUserPointer(int jid); + +/*! @brief Returns whether the specified joystick has a gamepad mapping. + * + * This function returns whether the specified joystick is both present and has + * a gamepad mapping. + * + * If the specified joystick is present but does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check if a joystick is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickIsGamepad(int jid); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * For joystick connection and disconnection events to be delivered on all + * platforms, you need to call one of the [event processing](@ref events) + * functions. Joystick disconnection may also be detected and the callback + * called by joystick functions. The function will then return whatever it + * returns if the joystick is not present. + * + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(int jid, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWjoystickfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); + +/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. + * + * This function parses the specified ASCII encoded string and updates the + * internal list with any gamepad mappings it finds. This string may + * contain either a single gamepad mapping or many mappings separated by + * newlines. The parser supports the full format of the `gamecontrollerdb.txt` + * source file including empty lines and comments. + * + * See @ref gamepad_mapping for a description of the format. + * + * If there is already a gamepad mapping for a given GUID in the internal list, + * it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in + * default. + * + * @param[in] string The string containing the gamepad mappings. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * @sa @ref glfwGetGamepadName + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwUpdateGamepadMappings(const char* string); + +/*! @brief Returns the human-readable gamepad name for the specified joystick. + * + * This function returns the human-readable name of the gamepad from the + * gamepad mapping assigned to the specified joystick. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `NULL` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the gamepad, or `NULL` if the + * joystick is not present, does not have a mapping or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. + * + * @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, the gamepad mappings are updated or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetGamepadName(int jid); + +/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. + * + * This function retrieves the state of the specified joystick remapped to + * an Xbox-like gamepad. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * The Guide button may not be available for input as it is often hooked by the + * system or the Steam client. + * + * Not all devices have all the buttons or axes provided by @ref + * GLFWgamepadstate. Unavailable buttons and axes will always report + * `GLFW_RELEASE` and 0.0 respectively. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] state The gamepad input state of the joystick. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is + * connected, it has no gamepad mapping or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwUpdateGamepadMappings + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwGetClipboardString + * + * @since Added in version 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. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the GLFW time. + * + * This function returns the current GLFW time, in seconds. Unless the time + * has been set using @ref glfwSetTime it measures time elapsed since GLFW was + * initialized. + * + * This function and @ref glfwSetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * 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 operating system. + * + * @return The current time, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW time. + * + * This function sets the current GLFW time, in seconds. The value must be + * a positive finite number less than or equal to 18446744073.0, which is + * approximately 584.5 years. + * + * This function and @ref glfwGetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of GLFW time 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. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @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. It can also detach the current context from + * the calling thread without making a new one current by passing in `NULL`. + * + * A context must only be made current on a single thread at a time and each + * thread can have only a single current context at a time. Making a context + * current detaches any previously current context on the calling thread. + * + * When moving a context between threads, you must detach it (make it + * non-current) on the old thread before making it current on the new one. + * + * 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 GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) + * hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @remarks If the previously current context was created via a different + * context creation API than the one passed to this function, GLFW will still + * detach the previous one from its API before making the new one current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwGetCurrentContext + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwMakeContextCurrent + * + * @since Added in version 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 when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 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 OpenGL or OpenGL ES + * 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_. + * + * A context that supports either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap + * intervals, which allows the driver to swap immediately even if a frame + * arrives a little bit late. You can check for these extensions with @ref + * glfwExtensionSupported. + * + * 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. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default for that API. 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. + * + * @remark 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. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and 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. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 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 OpenGL or OpenGL ES + * [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. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark 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 first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader and an ICD have been found. + * + * This function returns whether the Vulkan loader and any minimally functional + * ICD have been found. + * + * The availability of a Vulkan loader and even an ICD does not by itself guarantee that + * surface creation or even instance creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan + * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to + * check whether a queue family of a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contain `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remark Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @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 + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa @ref glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function currently always returns `GLFW_TRUE`, as the + * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide + * a `vkGetPhysicalDevice*PresentationSupport` type function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader or at least one minimally functional ICD were not found, + * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref + * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether + * Vulkan is at least minimally available. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface cannot be shared with another API so the window must + * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) + * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error + * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE + * + * @remark If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the + * `VK_MVK_macos_surface` extension as a fallback. The name of the selected + * extension, if any, is included in the array returned by @ref + * glfwGetRequiredInstanceExtensions. + * + * @remark @macos This function creates and sets a `CAMetalLayer` instance for + * the window content view, which is required for MoltenVK to function. + * + * @remark @x11 By default GLFW prefers the `VK_KHR_xcb_surface` extension, + * with the `VK_KHR_xlib_surface` extension as a fallback. You can make + * `VK_KHR_xlib_surface` the preferred extension by setting the + * [GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init + * hint. The name of the selected extension, if any, is included in the array + * returned by @ref glfwGetRequiredInstanceExtensions. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa @ref glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * 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 + +/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally + * defined by some gl.h variants (OpenBSD) so define it after if needed. + */ +#ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/include/GLFW/glfw3native.h b/include/GLFW/glfw3native.h new file mode 100644 index 0000000..92f0d32 --- /dev/null +++ b/include/GLFW/glfw3native.h @@ -0,0 +1,663 @@ +/************************************************************************* + * GLFW 3.4 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 Camilla Löwy + * + * 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 + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **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 may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * 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. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if !defined(GLFW_NATIVE_INCLUDE_NONE) + + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #endif + + #if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ + + +/************************************************************************* + * 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); + +/*! @brief Returns the `NSView` of the specified window. + * + * @return The `NSView` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.4. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaView(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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @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 + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/include/KHR/khrplatform.h b/include/KHR/khrplatform.h new file mode 100644 index 0000000..0164644 --- /dev/null +++ b/include/KHR/khrplatform.h @@ -0,0 +1,311 @@ +#ifndef __khrplatform_h_ +#define __khrplatform_h_ + +/* +** Copyright (c) 2008-2018 The Khronos Group Inc. +** +** Permission is hereby granted, free of charge, to any person obtaining a +** copy of this software and/or associated documentation files (the +** "Materials"), to deal in the Materials without restriction, including +** without limitation the rights to use, copy, modify, merge, publish, +** distribute, sublicense, and/or sell copies of the Materials, and to +** permit persons to whom the Materials are furnished to do so, subject to +** the following conditions: +** +** The above copyright notice and this permission notice shall be included +** in all copies or substantial portions of the Materials. +** +** THE MATERIALS ARE 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 OR COPYRIGHT HOLDERS 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 +** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. +*/ + +/* Khronos platform-specific types and definitions. + * + * The master copy of khrplatform.h is maintained in the Khronos EGL + * Registry repository at https://github.com/KhronosGroup/EGL-Registry + * The last semantic modification to khrplatform.h was at commit ID: + * 67a3e0864c2d75ea5287b9f3d2eb74a745936692 + * + * Adopters may modify this file to suit their platform. Adopters are + * encouraged to submit platform specific modifications to the Khronos + * group so that they can be included in future versions of this file. + * Please submit changes by filing pull requests or issues on + * the EGL Registry repository linked above. + * + * + * See the Implementer's Guidelines for information about where this file + * should be located on your system and for more details of its use: + * http://www.khronos.org/registry/implementers_guide.pdf + * + * This file should be included as + * #include + * by Khronos client API header files that use its types and defines. + * + * The types in khrplatform.h should only be used to define API-specific types. + * + * Types defined in khrplatform.h: + * khronos_int8_t signed 8 bit + * khronos_uint8_t unsigned 8 bit + * khronos_int16_t signed 16 bit + * khronos_uint16_t unsigned 16 bit + * khronos_int32_t signed 32 bit + * khronos_uint32_t unsigned 32 bit + * khronos_int64_t signed 64 bit + * khronos_uint64_t unsigned 64 bit + * khronos_intptr_t signed same number of bits as a pointer + * khronos_uintptr_t unsigned same number of bits as a pointer + * khronos_ssize_t signed size + * khronos_usize_t unsigned size + * khronos_float_t signed 32 bit floating point + * khronos_time_ns_t unsigned 64 bit time in nanoseconds + * khronos_utime_nanoseconds_t unsigned time interval or absolute time in + * nanoseconds + * khronos_stime_nanoseconds_t signed time interval in nanoseconds + * khronos_boolean_enum_t enumerated boolean type. This should + * only be used as a base type when a client API's boolean type is + * an enum. Client APIs which use an integer or other type for + * booleans cannot use this as the base type for their boolean. + * + * Tokens defined in khrplatform.h: + * + * KHRONOS_FALSE, KHRONOS_TRUE Enumerated boolean false/true values. + * + * KHRONOS_SUPPORT_INT64 is 1 if 64 bit integers are supported; otherwise 0. + * KHRONOS_SUPPORT_FLOAT is 1 if floats are supported; otherwise 0. + * + * Calling convention macros defined in this file: + * KHRONOS_APICALL + * KHRONOS_APIENTRY + * KHRONOS_APIATTRIBUTES + * + * These may be used in function prototypes as: + * + * KHRONOS_APICALL void KHRONOS_APIENTRY funcname( + * int arg1, + * int arg2) KHRONOS_APIATTRIBUTES; + */ + +#if defined(__SCITECH_SNAP__) && !defined(KHRONOS_STATIC) +# define KHRONOS_STATIC 1 +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APICALL + *------------------------------------------------------------------------- + * This precedes the return type of the function in the function prototype. + */ +#if defined(KHRONOS_STATIC) + /* If the preprocessor constant KHRONOS_STATIC is defined, make the + * header compatible with static linking. */ +# define KHRONOS_APICALL +#elif defined(_WIN32) +# define KHRONOS_APICALL __declspec(dllimport) +#elif defined (__SYMBIAN32__) +# define KHRONOS_APICALL IMPORT_C +#elif defined(__ANDROID__) +# define KHRONOS_APICALL __attribute__((visibility("default"))) +#else +# define KHRONOS_APICALL +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIENTRY + *------------------------------------------------------------------------- + * This follows the return type of the function and precedes the function + * name in the function prototype. + */ +#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__) + /* Win32 but not WinCE */ +# define KHRONOS_APIENTRY __stdcall +#else +# define KHRONOS_APIENTRY +#endif + +/*------------------------------------------------------------------------- + * Definition of KHRONOS_APIATTRIBUTES + *------------------------------------------------------------------------- + * This follows the closing parenthesis of the function prototype arguments. + */ +#if defined (__ARMCC_2__) +#define KHRONOS_APIATTRIBUTES __softfp +#else +#define KHRONOS_APIATTRIBUTES +#endif + +/*------------------------------------------------------------------------- + * basic type definitions + *-----------------------------------------------------------------------*/ +#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__GNUC__) || defined(__SCO__) || defined(__USLC__) + + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 +/* + * To support platform where unsigned long cannot be used interchangeably with + * inptr_t (e.g. CHERI-extended ISAs), we can use the stdint.h intptr_t. + * Ideally, we could just use (u)intptr_t everywhere, but this could result in + * ABI breakage if khronos_uintptr_t is changed from unsigned long to + * unsigned long long or similar (this results in different C++ name mangling). + * To avoid changes for existing platforms, we restrict usage of intptr_t to + * platforms where the size of a pointer is larger than the size of long. + */ +#if defined(__SIZEOF_LONG__) && defined(__SIZEOF_POINTER__) +#if __SIZEOF_POINTER__ > __SIZEOF_LONG__ +#define KHRONOS_USE_INTPTR_T +#endif +#endif + +#elif defined(__VMS ) || defined(__sgi) + +/* + * Using + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(_WIN32) && !defined(__SCITECH_SNAP__) + +/* + * Win32 + */ +typedef __int32 khronos_int32_t; +typedef unsigned __int32 khronos_uint32_t; +typedef __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif defined(__sun__) || defined(__digital__) + +/* + * Sun or Digital + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#if defined(__arch64__) || defined(_LP64) +typedef long int khronos_int64_t; +typedef unsigned long int khronos_uint64_t; +#else +typedef long long int khronos_int64_t; +typedef unsigned long long int khronos_uint64_t; +#endif /* __arch64__ */ +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#elif 0 + +/* + * Hypothetical platform with no float or int64 support + */ +typedef int khronos_int32_t; +typedef unsigned int khronos_uint32_t; +#define KHRONOS_SUPPORT_INT64 0 +#define KHRONOS_SUPPORT_FLOAT 0 + +#else + +/* + * Generic fallback + */ +#include +typedef int32_t khronos_int32_t; +typedef uint32_t khronos_uint32_t; +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#define KHRONOS_SUPPORT_INT64 1 +#define KHRONOS_SUPPORT_FLOAT 1 + +#endif + + +/* + * Types that are (so far) the same on all platforms + */ +typedef signed char khronos_int8_t; +typedef unsigned char khronos_uint8_t; +typedef signed short int khronos_int16_t; +typedef unsigned short int khronos_uint16_t; + +/* + * Types that differ between LLP64 and LP64 architectures - in LLP64, + * pointers are 64 bits, but 'long' is still 32 bits. Win64 appears + * to be the only LLP64 architecture in current use. + */ +#ifdef KHRONOS_USE_INTPTR_T +typedef intptr_t khronos_intptr_t; +typedef uintptr_t khronos_uintptr_t; +#elif defined(_WIN64) +typedef signed long long int khronos_intptr_t; +typedef unsigned long long int khronos_uintptr_t; +#else +typedef signed long int khronos_intptr_t; +typedef unsigned long int khronos_uintptr_t; +#endif + +#if defined(_WIN64) +typedef signed long long int khronos_ssize_t; +typedef unsigned long long int khronos_usize_t; +#else +typedef signed long int khronos_ssize_t; +typedef unsigned long int khronos_usize_t; +#endif + +#if KHRONOS_SUPPORT_FLOAT +/* + * Float type + */ +typedef float khronos_float_t; +#endif + +#if KHRONOS_SUPPORT_INT64 +/* Time types + * + * These types can be used to represent a time interval in nanoseconds or + * an absolute Unadjusted System Time. Unadjusted System Time is the number + * of nanoseconds since some arbitrary system event (e.g. since the last + * time the system booted). The Unadjusted System Time is an unsigned + * 64 bit value that wraps back to 0 every 584 years. Time intervals + * may be either signed or unsigned. + */ +typedef khronos_uint64_t khronos_utime_nanoseconds_t; +typedef khronos_int64_t khronos_stime_nanoseconds_t; +#endif + +/* + * Dummy value used to pad enum types to 32 bits. + */ +#ifndef KHRONOS_MAX_ENUM +#define KHRONOS_MAX_ENUM 0x7FFFFFFF +#endif + +/* + * Enumerated boolean type + * + * Values other than zero should be considered to be true. Therefore + * comparisons should not be made against KHRONOS_TRUE. + */ +typedef enum { + KHRONOS_FALSE = 0, + KHRONOS_TRUE = 1, + KHRONOS_BOOLEAN_ENUM_FORCE_SIZE = KHRONOS_MAX_ENUM +} khronos_boolean_enum_t; + +#endif /* __khrplatform_h_ */ diff --git a/include/glad/glad.h b/include/glad/glad.h new file mode 100644 index 0000000..82e4d6f --- /dev/null +++ b/include/glad/glad.h @@ -0,0 +1,2129 @@ +/* + + OpenGL loader generated by glad 0.1.36 on Sun Nov 9 22:34:23 2025. + + Language/Generator: C/C++ + Specification: gl + APIs: gl=3.3 + Profile: core + Extensions: + + Loader: True + Local files: False + Omit khrplatform: False + Reproducible: False + + Commandline: + --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" + Online: + https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 +*/ + + +#ifndef __glad_h_ +#define __glad_h_ + +#ifdef __gl_h_ +#error OpenGL header already included, remove this include, glad already provides it +#endif +#define __gl_h_ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#define APIENTRY __stdcall +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY APIENTRY +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +struct gladGLversionStruct { + int major; + int minor; +}; + +typedef void* (* GLADloadproc)(const char *name); + +#ifndef GLAPI +# if defined(GLAD_GLAPI_EXPORT) +# if defined(_WIN32) || defined(__CYGWIN__) +# if defined(GLAD_GLAPI_EXPORT_BUILD) +# if defined(__GNUC__) +# define GLAPI __attribute__ ((dllexport)) extern +# else +# define GLAPI __declspec(dllexport) extern +# endif +# else +# if defined(__GNUC__) +# define GLAPI __attribute__ ((dllimport)) extern +# else +# define GLAPI __declspec(dllimport) extern +# endif +# endif +# elif defined(__GNUC__) && defined(GLAD_GLAPI_EXPORT_BUILD) +# define GLAPI __attribute__ ((visibility ("default"))) extern +# else +# define GLAPI extern +# endif +# else +# define GLAPI extern +# endif +#endif + +GLAPI struct gladGLversionStruct GLVersion; + +GLAPI int gladLoadGL(void); + +GLAPI int gladLoadGLLoader(GLADloadproc); + +#include +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef khronos_int8_t GLbyte; +typedef khronos_uint8_t GLubyte; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef int GLint; +typedef unsigned int GLuint; +typedef khronos_int32_t GLclampx; +typedef int GLsizei; +typedef khronos_float_t GLfloat; +typedef khronos_float_t GLclampf; +typedef double GLdouble; +typedef double GLclampd; +typedef void *GLeglClientBufferEXT; +typedef void *GLeglImageOES; +typedef char GLchar; +typedef char GLcharARB; +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef khronos_uint16_t GLhalf; +typedef khronos_uint16_t GLhalfARB; +typedef khronos_int32_t GLfixed; +typedef khronos_intptr_t GLintptr; +typedef khronos_intptr_t GLintptrARB; +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_ssize_t GLsizeiptrARB; +typedef khronos_int64_t GLint64; +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64; +typedef khronos_uint64_t GLuint64EXT; +typedef struct __GLsync *GLsync; +struct _cl_context; +struct _cl_event; +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +typedef unsigned short GLhalfNV; +typedef GLintptr GLvdpauSurfaceNV; +typedef void (APIENTRY *GLVULKANPROCNV)(void); +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#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_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 +#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 +#define GL_DST_COLOR 0x0306 +#define GL_ONE_MINUS_DST_COLOR 0x0307 +#define GL_SRC_ALPHA_SATURATE 0x0308 +#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_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_OUT_OF_MEMORY 0x0505 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#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_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#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_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_VIEWPORT 0x0BA2 +#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_DRAW_BUFFER 0x0C01 +#define GL_READ_BUFFER 0x0C02 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#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_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#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_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 +#define GL_TEXTURE 0x1702 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#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_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_NEAREST 0x2600 +#define GL_LINEAR 0x2601 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_REPEAT 0x2901 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#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_DOUBLE 0x140A +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#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_UNSIGNED_BYTE_3_3_2 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_TEXTURE_BINDING_3D 0x806A +#define GL_PACK_SKIP_IMAGES 0x806B +#define GL_PACK_IMAGE_HEIGHT 0x806C +#define GL_UNPACK_SKIP_IMAGES 0x806D +#define GL_UNPACK_IMAGE_HEIGHT 0x806E +#define GL_TEXTURE_3D 0x806F +#define GL_PROXY_TEXTURE_3D 0x8070 +#define GL_TEXTURE_DEPTH 0x8071 +#define GL_TEXTURE_WRAP_R 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE 0x8073 +#define GL_UNSIGNED_BYTE_2_3_3_REV 0x8362 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_UNSIGNED_SHORT_5_6_5_REV 0x8364 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_TEXTURE_MIN_LOD 0x813A +#define GL_TEXTURE_MAX_LOD 0x813B +#define GL_TEXTURE_BASE_LEVEL 0x813C +#define GL_TEXTURE_MAX_LEVEL 0x813D +#define GL_SMOOTH_POINT_SIZE_RANGE 0x0B12 +#define GL_SMOOTH_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_SMOOTH_LINE_WIDTH_RANGE 0x0B22 +#define GL_SMOOTH_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_TEXTURE0 0x84C0 +#define GL_TEXTURE1 0x84C1 +#define GL_TEXTURE2 0x84C2 +#define GL_TEXTURE3 0x84C3 +#define GL_TEXTURE4 0x84C4 +#define GL_TEXTURE5 0x84C5 +#define GL_TEXTURE6 0x84C6 +#define GL_TEXTURE7 0x84C7 +#define GL_TEXTURE8 0x84C8 +#define GL_TEXTURE9 0x84C9 +#define GL_TEXTURE10 0x84CA +#define GL_TEXTURE11 0x84CB +#define GL_TEXTURE12 0x84CC +#define GL_TEXTURE13 0x84CD +#define GL_TEXTURE14 0x84CE +#define GL_TEXTURE15 0x84CF +#define GL_TEXTURE16 0x84D0 +#define GL_TEXTURE17 0x84D1 +#define GL_TEXTURE18 0x84D2 +#define GL_TEXTURE19 0x84D3 +#define GL_TEXTURE20 0x84D4 +#define GL_TEXTURE21 0x84D5 +#define GL_TEXTURE22 0x84D6 +#define GL_TEXTURE23 0x84D7 +#define GL_TEXTURE24 0x84D8 +#define GL_TEXTURE25 0x84D9 +#define GL_TEXTURE26 0x84DA +#define GL_TEXTURE27 0x84DB +#define GL_TEXTURE28 0x84DC +#define GL_TEXTURE29 0x84DD +#define GL_TEXTURE30 0x84DE +#define GL_TEXTURE31 0x84DF +#define GL_ACTIVE_TEXTURE 0x84E0 +#define GL_MULTISAMPLE 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE 0x809F +#define GL_SAMPLE_COVERAGE 0x80A0 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_TEXTURE_CUBE_MAP 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#define GL_COMPRESSED_RGB 0x84ED +#define GL_COMPRESSED_RGBA 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE 0x86A0 +#define GL_TEXTURE_COMPRESSED 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_CLAMP_TO_BORDER 0x812D +#define GL_BLEND_DST_RGB 0x80C8 +#define GL_BLEND_SRC_RGB 0x80C9 +#define GL_BLEND_DST_ALPHA 0x80CA +#define GL_BLEND_SRC_ALPHA 0x80CB +#define GL_POINT_FADE_THRESHOLD_SIZE 0x8128 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_DEPTH_COMPONENT24 0x81A6 +#define GL_DEPTH_COMPONENT32 0x81A7 +#define GL_MIRRORED_REPEAT 0x8370 +#define GL_MAX_TEXTURE_LOD_BIAS 0x84FD +#define GL_TEXTURE_LOD_BIAS 0x8501 +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#define GL_TEXTURE_DEPTH_SIZE 0x884A +#define GL_TEXTURE_COMPARE_MODE 0x884C +#define GL_TEXTURE_COMPARE_FUNC 0x884D +#define GL_BLEND_COLOR 0x8005 +#define GL_BLEND_EQUATION 0x8009 +#define GL_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_FUNC_SUBTRACT 0x800A +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_QUERY_COUNTER_BITS 0x8864 +#define GL_CURRENT_QUERY 0x8865 +#define GL_QUERY_RESULT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE 0x8867 +#define GL_ARRAY_BUFFER 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER 0x8893 +#define GL_ARRAY_BUFFER_BINDING 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_READ_ONLY 0x88B8 +#define GL_WRITE_ONLY 0x88B9 +#define GL_READ_WRITE 0x88BA +#define GL_BUFFER_ACCESS 0x88BB +#define GL_BUFFER_MAPPED 0x88BC +#define GL_BUFFER_MAP_POINTER 0x88BD +#define GL_STREAM_DRAW 0x88E0 +#define GL_STREAM_READ 0x88E1 +#define GL_STREAM_COPY 0x88E2 +#define GL_STATIC_DRAW 0x88E4 +#define GL_STATIC_READ 0x88E5 +#define GL_STATIC_COPY 0x88E6 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_DYNAMIC_READ 0x88E9 +#define GL_DYNAMIC_COPY 0x88EA +#define GL_SAMPLES_PASSED 0x8914 +#define GL_SRC1_ALPHA 0x8589 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE 0x8642 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_STENCIL_BACK_FUNC 0x8800 +#define GL_STENCIL_BACK_FAIL 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS 0x8803 +#define GL_MAX_DRAW_BUFFERS 0x8824 +#define GL_DRAW_BUFFER0 0x8825 +#define GL_DRAW_BUFFER1 0x8826 +#define GL_DRAW_BUFFER2 0x8827 +#define GL_DRAW_BUFFER3 0x8828 +#define GL_DRAW_BUFFER4 0x8829 +#define GL_DRAW_BUFFER5 0x882A +#define GL_DRAW_BUFFER6 0x882B +#define GL_DRAW_BUFFER7 0x882C +#define GL_DRAW_BUFFER8 0x882D +#define GL_DRAW_BUFFER9 0x882E +#define GL_DRAW_BUFFER10 0x882F +#define GL_DRAW_BUFFER11 0x8830 +#define GL_DRAW_BUFFER12 0x8831 +#define GL_DRAW_BUFFER13 0x8832 +#define GL_DRAW_BUFFER14 0x8833 +#define GL_DRAW_BUFFER15 0x8834 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 0x8B49 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS 0x8B4A +#define GL_MAX_VARYING_FLOATS 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_SHADER_TYPE 0x8B4F +#define GL_FLOAT_VEC2 0x8B50 +#define GL_FLOAT_VEC3 0x8B51 +#define GL_FLOAT_VEC4 0x8B52 +#define GL_INT_VEC2 0x8B53 +#define GL_INT_VEC3 0x8B54 +#define GL_INT_VEC4 0x8B55 +#define GL_BOOL 0x8B56 +#define GL_BOOL_VEC2 0x8B57 +#define GL_BOOL_VEC3 0x8B58 +#define GL_BOOL_VEC4 0x8B59 +#define GL_FLOAT_MAT2 0x8B5A +#define GL_FLOAT_MAT3 0x8B5B +#define GL_FLOAT_MAT4 0x8B5C +#define GL_SAMPLER_1D 0x8B5D +#define GL_SAMPLER_2D 0x8B5E +#define GL_SAMPLER_3D 0x8B5F +#define GL_SAMPLER_CUBE 0x8B60 +#define GL_SAMPLER_1D_SHADOW 0x8B61 +#define GL_SAMPLER_2D_SHADOW 0x8B62 +#define GL_DELETE_STATUS 0x8B80 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT 0x8B8B +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_POINT_SPRITE_COORD_ORIGIN 0x8CA0 +#define GL_LOWER_LEFT 0x8CA1 +#define GL_UPPER_LEFT 0x8CA2 +#define GL_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_PIXEL_PACK_BUFFER 0x88EB +#define GL_PIXEL_UNPACK_BUFFER 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF +#define GL_FLOAT_MAT2x3 0x8B65 +#define GL_FLOAT_MAT2x4 0x8B66 +#define GL_FLOAT_MAT3x2 0x8B67 +#define GL_FLOAT_MAT3x4 0x8B68 +#define GL_FLOAT_MAT4x2 0x8B69 +#define GL_FLOAT_MAT4x3 0x8B6A +#define GL_SRGB 0x8C40 +#define GL_SRGB8 0x8C41 +#define GL_SRGB_ALPHA 0x8C42 +#define GL_SRGB8_ALPHA8 0x8C43 +#define GL_COMPRESSED_SRGB 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA 0x8C49 +#define GL_COMPARE_REF_TO_TEXTURE 0x884E +#define GL_CLIP_DISTANCE0 0x3000 +#define GL_CLIP_DISTANCE1 0x3001 +#define GL_CLIP_DISTANCE2 0x3002 +#define GL_CLIP_DISTANCE3 0x3003 +#define GL_CLIP_DISTANCE4 0x3004 +#define GL_CLIP_DISTANCE5 0x3005 +#define GL_CLIP_DISTANCE6 0x3006 +#define GL_CLIP_DISTANCE7 0x3007 +#define GL_MAX_CLIP_DISTANCES 0x0D32 +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_CONTEXT_FLAGS 0x821E +#define GL_COMPRESSED_RED 0x8225 +#define GL_COMPRESSED_RG 0x8226 +#define GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT 0x00000001 +#define GL_RGBA32F 0x8814 +#define GL_RGB32F 0x8815 +#define GL_RGBA16F 0x881A +#define GL_RGB16F 0x881B +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER 0x88FD +#define GL_MAX_ARRAY_TEXTURE_LAYERS 0x88FF +#define GL_MIN_PROGRAM_TEXEL_OFFSET 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET 0x8905 +#define GL_CLAMP_READ_COLOR 0x891C +#define GL_FIXED_ONLY 0x891D +#define GL_MAX_VARYING_COMPONENTS 0x8B4B +#define GL_TEXTURE_1D_ARRAY 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY 0x8C19 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY 0x8C1D +#define GL_R11F_G11F_B10F 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV 0x8C3B +#define GL_RGB9_E5 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV 0x8C3E +#define GL_TEXTURE_SHARED_SIZE 0x8C3F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH 0x8C76 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE 0x8C85 +#define GL_PRIMITIVES_GENERATED 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN 0x8C88 +#define GL_RASTERIZER_DISCARD 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS 0x8C8B +#define GL_INTERLEAVED_ATTRIBS 0x8C8C +#define GL_SEPARATE_ATTRIBS 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING 0x8C8F +#define GL_RGBA32UI 0x8D70 +#define GL_RGB32UI 0x8D71 +#define GL_RGBA16UI 0x8D76 +#define GL_RGB16UI 0x8D77 +#define GL_RGBA8UI 0x8D7C +#define GL_RGB8UI 0x8D7D +#define GL_RGBA32I 0x8D82 +#define GL_RGB32I 0x8D83 +#define GL_RGBA16I 0x8D88 +#define GL_RGB16I 0x8D89 +#define GL_RGBA8I 0x8D8E +#define GL_RGB8I 0x8D8F +#define GL_RED_INTEGER 0x8D94 +#define GL_GREEN_INTEGER 0x8D95 +#define GL_BLUE_INTEGER 0x8D96 +#define GL_RGB_INTEGER 0x8D98 +#define GL_RGBA_INTEGER 0x8D99 +#define GL_BGR_INTEGER 0x8D9A +#define GL_BGRA_INTEGER 0x8D9B +#define GL_SAMPLER_1D_ARRAY 0x8DC0 +#define GL_SAMPLER_2D_ARRAY 0x8DC1 +#define GL_SAMPLER_1D_ARRAY_SHADOW 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW 0x8DC5 +#define GL_UNSIGNED_INT_VEC2 0x8DC6 +#define GL_UNSIGNED_INT_VEC3 0x8DC7 +#define GL_UNSIGNED_INT_VEC4 0x8DC8 +#define GL_INT_SAMPLER_1D 0x8DC9 +#define GL_INT_SAMPLER_2D 0x8DCA +#define GL_INT_SAMPLER_3D 0x8DCB +#define GL_INT_SAMPLER_CUBE 0x8DCC +#define GL_INT_SAMPLER_1D_ARRAY 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY 0x8DCF +#define GL_UNSIGNED_INT_SAMPLER_1D 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY 0x8DD7 +#define GL_QUERY_WAIT 0x8E13 +#define GL_QUERY_NO_WAIT 0x8E14 +#define GL_QUERY_BY_REGION_WAIT 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT 0x8E16 +#define GL_BUFFER_ACCESS_FLAGS 0x911F +#define GL_BUFFER_MAP_LENGTH 0x9120 +#define GL_BUFFER_MAP_OFFSET 0x9121 +#define GL_DEPTH_COMPONENT32F 0x8CAC +#define GL_DEPTH32F_STENCIL8 0x8CAD +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8DAD +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING 0x8210 +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE 0x8211 +#define GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE 0x8212 +#define GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE 0x8213 +#define GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE 0x8214 +#define GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE 0x8215 +#define GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE 0x8216 +#define GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE 0x8217 +#define GL_FRAMEBUFFER_DEFAULT 0x8218 +#define GL_FRAMEBUFFER_UNDEFINED 0x8219 +#define GL_DEPTH_STENCIL_ATTACHMENT 0x821A +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_DEPTH_STENCIL 0x84F9 +#define GL_UNSIGNED_INT_24_8 0x84FA +#define GL_DEPTH24_STENCIL8 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE 0x88F1 +#define GL_TEXTURE_RED_TYPE 0x8C10 +#define GL_TEXTURE_GREEN_TYPE 0x8C11 +#define GL_TEXTURE_BLUE_TYPE 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE 0x8C13 +#define GL_TEXTURE_DEPTH_TYPE 0x8C16 +#define GL_UNSIGNED_NORMALIZED 0x8C17 +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_DRAW_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_READ_FRAMEBUFFER 0x8CA8 +#define GL_DRAW_FRAMEBUFFER 0x8CA9 +#define GL_READ_FRAMEBUFFER_BINDING 0x8CAA +#define GL_RENDERBUFFER_SAMPLES 0x8CAB +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF +#define GL_COLOR_ATTACHMENT0 0x8CE0 +#define GL_COLOR_ATTACHMENT1 0x8CE1 +#define GL_COLOR_ATTACHMENT2 0x8CE2 +#define GL_COLOR_ATTACHMENT3 0x8CE3 +#define GL_COLOR_ATTACHMENT4 0x8CE4 +#define GL_COLOR_ATTACHMENT5 0x8CE5 +#define GL_COLOR_ATTACHMENT6 0x8CE6 +#define GL_COLOR_ATTACHMENT7 0x8CE7 +#define GL_COLOR_ATTACHMENT8 0x8CE8 +#define GL_COLOR_ATTACHMENT9 0x8CE9 +#define GL_COLOR_ATTACHMENT10 0x8CEA +#define GL_COLOR_ATTACHMENT11 0x8CEB +#define GL_COLOR_ATTACHMENT12 0x8CEC +#define GL_COLOR_ATTACHMENT13 0x8CED +#define GL_COLOR_ATTACHMENT14 0x8CEE +#define GL_COLOR_ATTACHMENT15 0x8CEF +#define GL_COLOR_ATTACHMENT16 0x8CF0 +#define GL_COLOR_ATTACHMENT17 0x8CF1 +#define GL_COLOR_ATTACHMENT18 0x8CF2 +#define GL_COLOR_ATTACHMENT19 0x8CF3 +#define GL_COLOR_ATTACHMENT20 0x8CF4 +#define GL_COLOR_ATTACHMENT21 0x8CF5 +#define GL_COLOR_ATTACHMENT22 0x8CF6 +#define GL_COLOR_ATTACHMENT23 0x8CF7 +#define GL_COLOR_ATTACHMENT24 0x8CF8 +#define GL_COLOR_ATTACHMENT25 0x8CF9 +#define GL_COLOR_ATTACHMENT26 0x8CFA +#define GL_COLOR_ATTACHMENT27 0x8CFB +#define GL_COLOR_ATTACHMENT28 0x8CFC +#define GL_COLOR_ATTACHMENT29 0x8CFD +#define GL_COLOR_ATTACHMENT30 0x8CFE +#define GL_COLOR_ATTACHMENT31 0x8CFF +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#define GL_STENCIL_INDEX1 0x8D46 +#define GL_STENCIL_INDEX4 0x8D47 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_STENCIL_INDEX16 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 0x8D56 +#define GL_MAX_SAMPLES 0x8D57 +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_HALF_FLOAT 0x140B +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT 0x0020 +#define GL_COMPRESSED_RED_RGTC1 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1 0x8DBC +#define GL_COMPRESSED_RG_RGTC2 0x8DBD +#define GL_COMPRESSED_SIGNED_RG_RGTC2 0x8DBE +#define GL_RG 0x8227 +#define GL_RG_INTEGER 0x8228 +#define GL_R8 0x8229 +#define GL_R16 0x822A +#define GL_RG8 0x822B +#define GL_RG16 0x822C +#define GL_R16F 0x822D +#define GL_R32F 0x822E +#define GL_RG16F 0x822F +#define GL_RG32F 0x8230 +#define GL_R8I 0x8231 +#define GL_R8UI 0x8232 +#define GL_R16I 0x8233 +#define GL_R16UI 0x8234 +#define GL_R32I 0x8235 +#define GL_R32UI 0x8236 +#define GL_RG8I 0x8237 +#define GL_RG8UI 0x8238 +#define GL_RG16I 0x8239 +#define GL_RG16UI 0x823A +#define GL_RG32I 0x823B +#define GL_RG32UI 0x823C +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +#define GL_SAMPLER_2D_RECT 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW 0x8B64 +#define GL_SAMPLER_BUFFER 0x8DC2 +#define GL_INT_SAMPLER_2D_RECT 0x8DCD +#define GL_INT_SAMPLER_BUFFER 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER 0x8DD8 +#define GL_TEXTURE_BUFFER 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING 0x8C2D +#define GL_TEXTURE_RECTANGLE 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE 0x84F8 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGB8_SNORM 0x8F96 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM 0x8F98 +#define GL_RG16_SNORM 0x8F99 +#define GL_RGB16_SNORM 0x8F9A +#define GL_RGBA16_SNORM 0x8F9B +#define GL_SIGNED_NORMALIZED 0x8F9C +#define GL_PRIMITIVE_RESTART 0x8F9D +#define GL_PRIMITIVE_RESTART_INDEX 0x8F9E +#define GL_COPY_READ_BUFFER 0x8F36 +#define GL_COPY_WRITE_BUFFER 0x8F37 +#define GL_UNIFORM_BUFFER 0x8A11 +#define GL_UNIFORM_BUFFER_BINDING 0x8A28 +#define GL_UNIFORM_BUFFER_START 0x8A29 +#define GL_UNIFORM_BUFFER_SIZE 0x8A2A +#define GL_MAX_VERTEX_UNIFORM_BLOCKS 0x8A2B +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS 0x8A2C +#define GL_MAX_FRAGMENT_UNIFORM_BLOCKS 0x8A2D +#define GL_MAX_COMBINED_UNIFORM_BLOCKS 0x8A2E +#define GL_MAX_UNIFORM_BUFFER_BINDINGS 0x8A2F +#define GL_MAX_UNIFORM_BLOCK_SIZE 0x8A30 +#define GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS 0x8A31 +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS 0x8A32 +#define GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS 0x8A33 +#define GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT 0x8A34 +#define GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH 0x8A35 +#define GL_ACTIVE_UNIFORM_BLOCKS 0x8A36 +#define GL_UNIFORM_TYPE 0x8A37 +#define GL_UNIFORM_SIZE 0x8A38 +#define GL_UNIFORM_NAME_LENGTH 0x8A39 +#define GL_UNIFORM_BLOCK_INDEX 0x8A3A +#define GL_UNIFORM_OFFSET 0x8A3B +#define GL_UNIFORM_ARRAY_STRIDE 0x8A3C +#define GL_UNIFORM_MATRIX_STRIDE 0x8A3D +#define GL_UNIFORM_IS_ROW_MAJOR 0x8A3E +#define GL_UNIFORM_BLOCK_BINDING 0x8A3F +#define GL_UNIFORM_BLOCK_DATA_SIZE 0x8A40 +#define GL_UNIFORM_BLOCK_NAME_LENGTH 0x8A41 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS 0x8A42 +#define GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES 0x8A43 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER 0x8A44 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER 0x8A45 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER 0x8A46 +#define GL_INVALID_INDEX 0xFFFFFFFF +#define GL_CONTEXT_CORE_PROFILE_BIT 0x00000001 +#define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define GL_LINES_ADJACENCY 0x000A +#define GL_LINE_STRIP_ADJACENCY 0x000B +#define GL_TRIANGLES_ADJACENCY 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY 0x000D +#define GL_PROGRAM_POINT_SIZE 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS 0x8DA8 +#define GL_GEOMETRY_SHADER 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT 0x8916 +#define GL_GEOMETRY_INPUT_TYPE 0x8917 +#define GL_GEOMETRY_OUTPUT_TYPE 0x8918 +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS 0x8DE1 +#define GL_MAX_VERTEX_OUTPUT_COMPONENTS 0x9122 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS 0x9124 +#define GL_MAX_FRAGMENT_INPUT_COMPONENTS 0x9125 +#define GL_CONTEXT_PROFILE_MASK 0x9126 +#define GL_DEPTH_CLAMP 0x864F +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION 0x8E4D +#define GL_LAST_VERTEX_CONVENTION 0x8E4E +#define GL_PROVOKING_VERTEX 0x8E4F +#define GL_TEXTURE_CUBE_MAP_SEAMLESS 0x884F +#define GL_MAX_SERVER_WAIT_TIMEOUT 0x9111 +#define GL_OBJECT_TYPE 0x9112 +#define GL_SYNC_CONDITION 0x9113 +#define GL_SYNC_STATUS 0x9114 +#define GL_SYNC_FLAGS 0x9115 +#define GL_SYNC_FENCE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 +#define GL_UNSIGNALED 0x9118 +#define GL_SIGNALED 0x9119 +#define GL_ALREADY_SIGNALED 0x911A +#define GL_TIMEOUT_EXPIRED 0x911B +#define GL_CONDITION_SATISFIED 0x911C +#define GL_WAIT_FAILED 0x911D +#define GL_TIMEOUT_IGNORED 0xFFFFFFFFFFFFFFFF +#define GL_SYNC_FLUSH_COMMANDS_BIT 0x00000001 +#define GL_SAMPLE_POSITION 0x8E50 +#define GL_SAMPLE_MASK 0x8E51 +#define GL_SAMPLE_MASK_VALUE 0x8E52 +#define GL_MAX_SAMPLE_MASK_WORDS 0x8E59 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE 0x9101 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9103 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE 0x9104 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY 0x9105 +#define GL_TEXTURE_SAMPLES 0x9106 +#define GL_TEXTURE_FIXED_SAMPLE_LOCATIONS 0x9107 +#define GL_SAMPLER_2D_MULTISAMPLE 0x9108 +#define GL_INT_SAMPLER_2D_MULTISAMPLE 0x9109 +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE 0x910A +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY 0x910D +#define GL_MAX_COLOR_TEXTURE_SAMPLES 0x910E +#define GL_MAX_DEPTH_TEXTURE_SAMPLES 0x910F +#define GL_MAX_INTEGER_SAMPLES 0x9110 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR 0x88FE +#define GL_SRC1_COLOR 0x88F9 +#define GL_ONE_MINUS_SRC1_COLOR 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA 0x88FB +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS 0x88FC +#define GL_ANY_SAMPLES_PASSED 0x8C2F +#define GL_SAMPLER_BINDING 0x8919 +#define GL_RGB10_A2UI 0x906F +#define GL_TEXTURE_SWIZZLE_R 0x8E42 +#define GL_TEXTURE_SWIZZLE_G 0x8E43 +#define GL_TEXTURE_SWIZZLE_B 0x8E44 +#define GL_TEXTURE_SWIZZLE_A 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA 0x8E46 +#define GL_TIME_ELAPSED 0x88BF +#define GL_TIMESTAMP 0x8E28 +#define GL_INT_2_10_10_10_REV 0x8D9F +#ifndef GL_VERSION_1_0 +#define GL_VERSION_1_0 1 +GLAPI int GLAD_GL_VERSION_1_0; +typedef void (APIENTRYP PFNGLCULLFACEPROC)(GLenum mode); +GLAPI PFNGLCULLFACEPROC glad_glCullFace; +#define glCullFace glad_glCullFace +typedef void (APIENTRYP PFNGLFRONTFACEPROC)(GLenum mode); +GLAPI PFNGLFRONTFACEPROC glad_glFrontFace; +#define glFrontFace glad_glFrontFace +typedef void (APIENTRYP PFNGLHINTPROC)(GLenum target, GLenum mode); +GLAPI PFNGLHINTPROC glad_glHint; +#define glHint glad_glHint +typedef void (APIENTRYP PFNGLLINEWIDTHPROC)(GLfloat width); +GLAPI PFNGLLINEWIDTHPROC glad_glLineWidth; +#define glLineWidth glad_glLineWidth +typedef void (APIENTRYP PFNGLPOINTSIZEPROC)(GLfloat size); +GLAPI PFNGLPOINTSIZEPROC glad_glPointSize; +#define glPointSize glad_glPointSize +typedef void (APIENTRYP PFNGLPOLYGONMODEPROC)(GLenum face, GLenum mode); +GLAPI PFNGLPOLYGONMODEPROC glad_glPolygonMode; +#define glPolygonMode glad_glPolygonMode +typedef void (APIENTRYP PFNGLSCISSORPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLSCISSORPROC glad_glScissor; +#define glScissor glad_glScissor +typedef void (APIENTRYP PFNGLTEXPARAMETERFPROC)(GLenum target, GLenum pname, GLfloat param); +GLAPI PFNGLTEXPARAMETERFPROC glad_glTexParameterf; +#define glTexParameterf glad_glTexParameterf +typedef void (APIENTRYP PFNGLTEXPARAMETERFVPROC)(GLenum target, GLenum pname, const GLfloat *params); +GLAPI PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv; +#define glTexParameterfv glad_glTexParameterfv +typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +GLAPI PFNGLTEXPARAMETERIPROC glad_glTexParameteri; +#define glTexParameteri glad_glTexParameteri +typedef void (APIENTRYP PFNGLTEXPARAMETERIVPROC)(GLenum target, GLenum pname, const GLint *params); +GLAPI PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv; +#define glTexParameteriv glad_glTexParameteriv +typedef void (APIENTRYP PFNGLTEXIMAGE1DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE1DPROC glad_glTexImage1D; +#define glTexImage1D glad_glTexImage1D +typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE2DPROC glad_glTexImage2D; +#define glTexImage2D glad_glTexImage2D +typedef void (APIENTRYP PFNGLDRAWBUFFERPROC)(GLenum buf); +GLAPI PFNGLDRAWBUFFERPROC glad_glDrawBuffer; +#define glDrawBuffer glad_glDrawBuffer +typedef void (APIENTRYP PFNGLCLEARPROC)(GLbitfield mask); +GLAPI PFNGLCLEARPROC glad_glClear; +#define glClear glad_glClear +typedef void (APIENTRYP PFNGLCLEARCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLCLEARCOLORPROC glad_glClearColor; +#define glClearColor glad_glClearColor +typedef void (APIENTRYP PFNGLCLEARSTENCILPROC)(GLint s); +GLAPI PFNGLCLEARSTENCILPROC glad_glClearStencil; +#define glClearStencil glad_glClearStencil +typedef void (APIENTRYP PFNGLCLEARDEPTHPROC)(GLdouble depth); +GLAPI PFNGLCLEARDEPTHPROC glad_glClearDepth; +#define glClearDepth glad_glClearDepth +typedef void (APIENTRYP PFNGLSTENCILMASKPROC)(GLuint mask); +GLAPI PFNGLSTENCILMASKPROC glad_glStencilMask; +#define glStencilMask glad_glStencilMask +typedef void (APIENTRYP PFNGLCOLORMASKPROC)(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GLAPI PFNGLCOLORMASKPROC glad_glColorMask; +#define glColorMask glad_glColorMask +typedef void (APIENTRYP PFNGLDEPTHMASKPROC)(GLboolean flag); +GLAPI PFNGLDEPTHMASKPROC glad_glDepthMask; +#define glDepthMask glad_glDepthMask +typedef void (APIENTRYP PFNGLDISABLEPROC)(GLenum cap); +GLAPI PFNGLDISABLEPROC glad_glDisable; +#define glDisable glad_glDisable +typedef void (APIENTRYP PFNGLENABLEPROC)(GLenum cap); +GLAPI PFNGLENABLEPROC glad_glEnable; +#define glEnable glad_glEnable +typedef void (APIENTRYP PFNGLFINISHPROC)(void); +GLAPI PFNGLFINISHPROC glad_glFinish; +#define glFinish glad_glFinish +typedef void (APIENTRYP PFNGLFLUSHPROC)(void); +GLAPI PFNGLFLUSHPROC glad_glFlush; +#define glFlush glad_glFlush +typedef void (APIENTRYP PFNGLBLENDFUNCPROC)(GLenum sfactor, GLenum dfactor); +GLAPI PFNGLBLENDFUNCPROC glad_glBlendFunc; +#define glBlendFunc glad_glBlendFunc +typedef void (APIENTRYP PFNGLLOGICOPPROC)(GLenum opcode); +GLAPI PFNGLLOGICOPPROC glad_glLogicOp; +#define glLogicOp glad_glLogicOp +typedef void (APIENTRYP PFNGLSTENCILFUNCPROC)(GLenum func, GLint ref, GLuint mask); +GLAPI PFNGLSTENCILFUNCPROC glad_glStencilFunc; +#define glStencilFunc glad_glStencilFunc +typedef void (APIENTRYP PFNGLSTENCILOPPROC)(GLenum fail, GLenum zfail, GLenum zpass); +GLAPI PFNGLSTENCILOPPROC glad_glStencilOp; +#define glStencilOp glad_glStencilOp +typedef void (APIENTRYP PFNGLDEPTHFUNCPROC)(GLenum func); +GLAPI PFNGLDEPTHFUNCPROC glad_glDepthFunc; +#define glDepthFunc glad_glDepthFunc +typedef void (APIENTRYP PFNGLPIXELSTOREFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLPIXELSTOREFPROC glad_glPixelStoref; +#define glPixelStoref glad_glPixelStoref +typedef void (APIENTRYP PFNGLPIXELSTOREIPROC)(GLenum pname, GLint param); +GLAPI PFNGLPIXELSTOREIPROC glad_glPixelStorei; +#define glPixelStorei glad_glPixelStorei +typedef void (APIENTRYP PFNGLREADBUFFERPROC)(GLenum src); +GLAPI PFNGLREADBUFFERPROC glad_glReadBuffer; +#define glReadBuffer glad_glReadBuffer +typedef void (APIENTRYP PFNGLREADPIXELSPROC)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI PFNGLREADPIXELSPROC glad_glReadPixels; +#define glReadPixels glad_glReadPixels +typedef void (APIENTRYP PFNGLGETBOOLEANVPROC)(GLenum pname, GLboolean *data); +GLAPI PFNGLGETBOOLEANVPROC glad_glGetBooleanv; +#define glGetBooleanv glad_glGetBooleanv +typedef void (APIENTRYP PFNGLGETDOUBLEVPROC)(GLenum pname, GLdouble *data); +GLAPI PFNGLGETDOUBLEVPROC glad_glGetDoublev; +#define glGetDoublev glad_glGetDoublev +typedef GLenum (APIENTRYP PFNGLGETERRORPROC)(void); +GLAPI PFNGLGETERRORPROC glad_glGetError; +#define glGetError glad_glGetError +typedef void (APIENTRYP PFNGLGETFLOATVPROC)(GLenum pname, GLfloat *data); +GLAPI PFNGLGETFLOATVPROC glad_glGetFloatv; +#define glGetFloatv glad_glGetFloatv +typedef void (APIENTRYP PFNGLGETINTEGERVPROC)(GLenum pname, GLint *data); +GLAPI PFNGLGETINTEGERVPROC glad_glGetIntegerv; +#define glGetIntegerv glad_glGetIntegerv +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC)(GLenum name); +GLAPI PFNGLGETSTRINGPROC glad_glGetString; +#define glGetString glad_glGetString +typedef void (APIENTRYP PFNGLGETTEXIMAGEPROC)(GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI PFNGLGETTEXIMAGEPROC glad_glGetTexImage; +#define glGetTexImage glad_glGetTexImage +typedef void (APIENTRYP PFNGLGETTEXPARAMETERFVPROC)(GLenum target, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv; +#define glGetTexParameterfv glad_glGetTexParameterfv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv; +#define glGetTexParameteriv glad_glGetTexParameteriv +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERFVPROC)(GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv; +#define glGetTexLevelParameterfv glad_glGetTexLevelParameterfv +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERIVPROC)(GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv; +#define glGetTexLevelParameteriv glad_glGetTexLevelParameteriv +typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC)(GLenum cap); +GLAPI PFNGLISENABLEDPROC glad_glIsEnabled; +#define glIsEnabled glad_glIsEnabled +typedef void (APIENTRYP PFNGLDEPTHRANGEPROC)(GLdouble n, GLdouble f); +GLAPI PFNGLDEPTHRANGEPROC glad_glDepthRange; +#define glDepthRange glad_glDepthRange +typedef void (APIENTRYP PFNGLVIEWPORTPROC)(GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLVIEWPORTPROC glad_glViewport; +#define glViewport glad_glViewport +#endif +#ifndef GL_VERSION_1_1 +#define GL_VERSION_1_1 1 +GLAPI int GLAD_GL_VERSION_1_1; +typedef void (APIENTRYP PFNGLDRAWARRAYSPROC)(GLenum mode, GLint first, GLsizei count); +GLAPI PFNGLDRAWARRAYSPROC glad_glDrawArrays; +#define glDrawArrays glad_glDrawArrays +typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI PFNGLDRAWELEMENTSPROC glad_glDrawElements; +#define glDrawElements glad_glDrawElements +typedef void (APIENTRYP PFNGLPOLYGONOFFSETPROC)(GLfloat factor, GLfloat units); +GLAPI PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset; +#define glPolygonOffset glad_glPolygonOffset +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D; +#define glCopyTexImage1D glad_glCopyTexImage1D +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D; +#define glCopyTexImage2D glad_glCopyTexImage2D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D; +#define glCopyTexSubImage1D glad_glCopyTexSubImage1D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D; +#define glCopyTexSubImage2D glad_glCopyTexSubImage2D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D; +#define glTexSubImage1D glad_glTexSubImage1D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D; +#define glTexSubImage2D glad_glTexSubImage2D +typedef void (APIENTRYP PFNGLBINDTEXTUREPROC)(GLenum target, GLuint texture); +GLAPI PFNGLBINDTEXTUREPROC glad_glBindTexture; +#define glBindTexture glad_glBindTexture +typedef void (APIENTRYP PFNGLDELETETEXTURESPROC)(GLsizei n, const GLuint *textures); +GLAPI PFNGLDELETETEXTURESPROC glad_glDeleteTextures; +#define glDeleteTextures glad_glDeleteTextures +typedef void (APIENTRYP PFNGLGENTEXTURESPROC)(GLsizei n, GLuint *textures); +GLAPI PFNGLGENTEXTURESPROC glad_glGenTextures; +#define glGenTextures glad_glGenTextures +typedef GLboolean (APIENTRYP PFNGLISTEXTUREPROC)(GLuint texture); +GLAPI PFNGLISTEXTUREPROC glad_glIsTexture; +#define glIsTexture glad_glIsTexture +#endif +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +GLAPI int GLAD_GL_VERSION_1_2; +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements; +#define glDrawRangeElements glad_glDrawRangeElements +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXIMAGE3DPROC glad_glTexImage3D; +#define glTexImage3D glad_glTexImage3D +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D; +#define glTexSubImage3D glad_glTexSubImage3D +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D; +#define glCopyTexSubImage3D glad_glCopyTexSubImage3D +#endif +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +GLAPI int GLAD_GL_VERSION_1_3; +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC)(GLenum texture); +GLAPI PFNGLACTIVETEXTUREPROC glad_glActiveTexture; +#define glActiveTexture glad_glActiveTexture +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC)(GLfloat value, GLboolean invert); +GLAPI PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage; +#define glSampleCoverage glad_glSampleCoverage +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D; +#define glCompressedTexImage3D glad_glCompressedTexImage3D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D; +#define glCompressedTexImage2D glad_glCompressedTexImage2D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC)(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D; +#define glCompressedTexImage1D glad_glCompressedTexImage1D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D; +#define glCompressedTexSubImage3D glad_glCompressedTexSubImage3D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D; +#define glCompressedTexSubImage2D glad_glCompressedTexSubImage2D +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)(GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D; +#define glCompressedTexSubImage1D glad_glCompressedTexSubImage1D +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC)(GLenum target, GLint level, void *img); +GLAPI PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage; +#define glGetCompressedTexImage glad_glGetCompressedTexImage +#endif +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +GLAPI int GLAD_GL_VERSION_1_4; +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC)(GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate; +#define glBlendFuncSeparate glad_glBlendFuncSeparate +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC)(GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays; +#define glMultiDrawArrays glad_glMultiDrawArrays +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements; +#define glMultiDrawElements glad_glMultiDrawElements +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC)(GLenum pname, GLfloat param); +GLAPI PFNGLPOINTPARAMETERFPROC glad_glPointParameterf; +#define glPointParameterf glad_glPointParameterf +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC)(GLenum pname, const GLfloat *params); +GLAPI PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv; +#define glPointParameterfv glad_glPointParameterfv +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC)(GLenum pname, GLint param); +GLAPI PFNGLPOINTPARAMETERIPROC glad_glPointParameteri; +#define glPointParameteri glad_glPointParameteri +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC)(GLenum pname, const GLint *params); +GLAPI PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv; +#define glPointParameteriv glad_glPointParameteriv +typedef void (APIENTRYP PFNGLBLENDCOLORPROC)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI PFNGLBLENDCOLORPROC glad_glBlendColor; +#define glBlendColor glad_glBlendColor +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC)(GLenum mode); +GLAPI PFNGLBLENDEQUATIONPROC glad_glBlendEquation; +#define glBlendEquation glad_glBlendEquation +#endif +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +GLAPI int GLAD_GL_VERSION_1_5; +typedef void (APIENTRYP PFNGLGENQUERIESPROC)(GLsizei n, GLuint *ids); +GLAPI PFNGLGENQUERIESPROC glad_glGenQueries; +#define glGenQueries glad_glGenQueries +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC)(GLsizei n, const GLuint *ids); +GLAPI PFNGLDELETEQUERIESPROC glad_glDeleteQueries; +#define glDeleteQueries glad_glDeleteQueries +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC)(GLuint id); +GLAPI PFNGLISQUERYPROC glad_glIsQuery; +#define glIsQuery glad_glIsQuery +typedef void (APIENTRYP PFNGLBEGINQUERYPROC)(GLenum target, GLuint id); +GLAPI PFNGLBEGINQUERYPROC glad_glBeginQuery; +#define glBeginQuery glad_glBeginQuery +typedef void (APIENTRYP PFNGLENDQUERYPROC)(GLenum target); +GLAPI PFNGLENDQUERYPROC glad_glEndQuery; +#define glEndQuery glad_glEndQuery +typedef void (APIENTRYP PFNGLGETQUERYIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETQUERYIVPROC glad_glGetQueryiv; +#define glGetQueryiv glad_glGetQueryiv +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC)(GLuint id, GLenum pname, GLint *params); +GLAPI PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv; +#define glGetQueryObjectiv glad_glGetQueryObjectiv +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC)(GLuint id, GLenum pname, GLuint *params); +GLAPI PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv; +#define glGetQueryObjectuiv glad_glGetQueryObjectuiv +typedef void (APIENTRYP PFNGLBINDBUFFERPROC)(GLenum target, GLuint buffer); +GLAPI PFNGLBINDBUFFERPROC glad_glBindBuffer; +#define glBindBuffer glad_glBindBuffer +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC)(GLsizei n, const GLuint *buffers); +GLAPI PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers; +#define glDeleteBuffers glad_glDeleteBuffers +typedef void (APIENTRYP PFNGLGENBUFFERSPROC)(GLsizei n, GLuint *buffers); +GLAPI PFNGLGENBUFFERSPROC glad_glGenBuffers; +#define glGenBuffers glad_glGenBuffers +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC)(GLuint buffer); +GLAPI PFNGLISBUFFERPROC glad_glIsBuffer; +#define glIsBuffer glad_glIsBuffer +typedef void (APIENTRYP PFNGLBUFFERDATAPROC)(GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI PFNGLBUFFERDATAPROC glad_glBufferData; +#define glBufferData glad_glBufferData +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI PFNGLBUFFERSUBDATAPROC glad_glBufferSubData; +#define glBufferSubData glad_glBufferSubData +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC)(GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData; +#define glGetBufferSubData glad_glGetBufferSubData +typedef void * (APIENTRYP PFNGLMAPBUFFERPROC)(GLenum target, GLenum access); +GLAPI PFNGLMAPBUFFERPROC glad_glMapBuffer; +#define glMapBuffer glad_glMapBuffer +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC)(GLenum target); +GLAPI PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer; +#define glUnmapBuffer glad_glUnmapBuffer +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv; +#define glGetBufferParameteriv glad_glGetBufferParameteriv +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC)(GLenum target, GLenum pname, void **params); +GLAPI PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv; +#define glGetBufferPointerv glad_glGetBufferPointerv +#endif +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +GLAPI int GLAD_GL_VERSION_2_0; +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC)(GLenum modeRGB, GLenum modeAlpha); +GLAPI PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate; +#define glBlendEquationSeparate glad_glBlendEquationSeparate +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC)(GLsizei n, const GLenum *bufs); +GLAPI PFNGLDRAWBUFFERSPROC glad_glDrawBuffers; +#define glDrawBuffers glad_glDrawBuffers +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC)(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate; +#define glStencilOpSeparate glad_glStencilOpSeparate +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC)(GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate; +#define glStencilFuncSeparate glad_glStencilFuncSeparate +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC)(GLenum face, GLuint mask); +GLAPI PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate; +#define glStencilMaskSeparate glad_glStencilMaskSeparate +typedef void (APIENTRYP PFNGLATTACHSHADERPROC)(GLuint program, GLuint shader); +GLAPI PFNGLATTACHSHADERPROC glad_glAttachShader; +#define glAttachShader glad_glAttachShader +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC)(GLuint program, GLuint index, const GLchar *name); +GLAPI PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation; +#define glBindAttribLocation glad_glBindAttribLocation +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC)(GLuint shader); +GLAPI PFNGLCOMPILESHADERPROC glad_glCompileShader; +#define glCompileShader glad_glCompileShader +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC)(void); +GLAPI PFNGLCREATEPROGRAMPROC glad_glCreateProgram; +#define glCreateProgram glad_glCreateProgram +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC)(GLenum type); +GLAPI PFNGLCREATESHADERPROC glad_glCreateShader; +#define glCreateShader glad_glCreateShader +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC)(GLuint program); +GLAPI PFNGLDELETEPROGRAMPROC glad_glDeleteProgram; +#define glDeleteProgram glad_glDeleteProgram +typedef void (APIENTRYP PFNGLDELETESHADERPROC)(GLuint shader); +GLAPI PFNGLDELETESHADERPROC glad_glDeleteShader; +#define glDeleteShader glad_glDeleteShader +typedef void (APIENTRYP PFNGLDETACHSHADERPROC)(GLuint program, GLuint shader); +GLAPI PFNGLDETACHSHADERPROC glad_glDetachShader; +#define glDetachShader glad_glDetachShader +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC)(GLuint index); +GLAPI PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray; +#define glDisableVertexAttribArray glad_glDisableVertexAttribArray +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC)(GLuint index); +GLAPI PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray; +#define glEnableVertexAttribArray glad_glEnableVertexAttribArray +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib; +#define glGetActiveAttrib glad_glGetActiveAttrib +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform; +#define glGetActiveUniform glad_glGetActiveUniform +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC)(GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders; +#define glGetAttachedShaders glad_glGetAttachedShaders +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation; +#define glGetAttribLocation glad_glGetAttribLocation +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC)(GLuint program, GLenum pname, GLint *params); +GLAPI PFNGLGETPROGRAMIVPROC glad_glGetProgramiv; +#define glGetProgramiv glad_glGetProgramiv +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog; +#define glGetProgramInfoLog glad_glGetProgramInfoLog +typedef void (APIENTRYP PFNGLGETSHADERIVPROC)(GLuint shader, GLenum pname, GLint *params); +GLAPI PFNGLGETSHADERIVPROC glad_glGetShaderiv; +#define glGetShaderiv glad_glGetShaderiv +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog; +#define glGetShaderInfoLog glad_glGetShaderInfoLog +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource; +#define glGetShaderSource glad_glGetShaderSource +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation; +#define glGetUniformLocation glad_glGetUniformLocation +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC)(GLuint program, GLint location, GLfloat *params); +GLAPI PFNGLGETUNIFORMFVPROC glad_glGetUniformfv; +#define glGetUniformfv glad_glGetUniformfv +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC)(GLuint program, GLint location, GLint *params); +GLAPI PFNGLGETUNIFORMIVPROC glad_glGetUniformiv; +#define glGetUniformiv glad_glGetUniformiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC)(GLuint index, GLenum pname, GLdouble *params); +GLAPI PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv; +#define glGetVertexAttribdv glad_glGetVertexAttribdv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC)(GLuint index, GLenum pname, GLfloat *params); +GLAPI PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv; +#define glGetVertexAttribfv glad_glGetVertexAttribfv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC)(GLuint index, GLenum pname, GLint *params); +GLAPI PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv; +#define glGetVertexAttribiv glad_glGetVertexAttribiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC)(GLuint index, GLenum pname, void **pointer); +GLAPI PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv; +#define glGetVertexAttribPointerv glad_glGetVertexAttribPointerv +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC)(GLuint program); +GLAPI PFNGLISPROGRAMPROC glad_glIsProgram; +#define glIsProgram glad_glIsProgram +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC)(GLuint shader); +GLAPI PFNGLISSHADERPROC glad_glIsShader; +#define glIsShader glad_glIsShader +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC)(GLuint program); +GLAPI PFNGLLINKPROGRAMPROC glad_glLinkProgram; +#define glLinkProgram glad_glLinkProgram +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI PFNGLSHADERSOURCEPROC glad_glShaderSource; +#define glShaderSource glad_glShaderSource +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC)(GLuint program); +GLAPI PFNGLUSEPROGRAMPROC glad_glUseProgram; +#define glUseProgram glad_glUseProgram +typedef void (APIENTRYP PFNGLUNIFORM1FPROC)(GLint location, GLfloat v0); +GLAPI PFNGLUNIFORM1FPROC glad_glUniform1f; +#define glUniform1f glad_glUniform1f +typedef void (APIENTRYP PFNGLUNIFORM2FPROC)(GLint location, GLfloat v0, GLfloat v1); +GLAPI PFNGLUNIFORM2FPROC glad_glUniform2f; +#define glUniform2f glad_glUniform2f +typedef void (APIENTRYP PFNGLUNIFORM3FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI PFNGLUNIFORM3FPROC glad_glUniform3f; +#define glUniform3f glad_glUniform3f +typedef void (APIENTRYP PFNGLUNIFORM4FPROC)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI PFNGLUNIFORM4FPROC glad_glUniform4f; +#define glUniform4f glad_glUniform4f +typedef void (APIENTRYP PFNGLUNIFORM1IPROC)(GLint location, GLint v0); +GLAPI PFNGLUNIFORM1IPROC glad_glUniform1i; +#define glUniform1i glad_glUniform1i +typedef void (APIENTRYP PFNGLUNIFORM2IPROC)(GLint location, GLint v0, GLint v1); +GLAPI PFNGLUNIFORM2IPROC glad_glUniform2i; +#define glUniform2i glad_glUniform2i +typedef void (APIENTRYP PFNGLUNIFORM3IPROC)(GLint location, GLint v0, GLint v1, GLint v2); +GLAPI PFNGLUNIFORM3IPROC glad_glUniform3i; +#define glUniform3i glad_glUniform3i +typedef void (APIENTRYP PFNGLUNIFORM4IPROC)(GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI PFNGLUNIFORM4IPROC glad_glUniform4i; +#define glUniform4i glad_glUniform4i +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM1FVPROC glad_glUniform1fv; +#define glUniform1fv glad_glUniform1fv +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM2FVPROC glad_glUniform2fv; +#define glUniform2fv glad_glUniform2fv +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM3FVPROC glad_glUniform3fv; +#define glUniform3fv glad_glUniform3fv +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC)(GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLUNIFORM4FVPROC glad_glUniform4fv; +#define glUniform4fv glad_glUniform4fv +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM1IVPROC glad_glUniform1iv; +#define glUniform1iv glad_glUniform1iv +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM2IVPROC glad_glUniform2iv; +#define glUniform2iv glad_glUniform2iv +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM3IVPROC glad_glUniform3iv; +#define glUniform3iv glad_glUniform3iv +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC)(GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLUNIFORM4IVPROC glad_glUniform4iv; +#define glUniform4iv glad_glUniform4iv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv; +#define glUniformMatrix2fv glad_glUniformMatrix2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv; +#define glUniformMatrix3fv glad_glUniformMatrix3fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv; +#define glUniformMatrix4fv glad_glUniformMatrix4fv +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC)(GLuint program); +GLAPI PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram; +#define glValidateProgram glad_glValidateProgram +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC)(GLuint index, GLdouble x); +GLAPI PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d; +#define glVertexAttrib1d glad_glVertexAttrib1d +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv; +#define glVertexAttrib1dv glad_glVertexAttrib1dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC)(GLuint index, GLfloat x); +GLAPI PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f; +#define glVertexAttrib1f glad_glVertexAttrib1f +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv; +#define glVertexAttrib1fv glad_glVertexAttrib1fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC)(GLuint index, GLshort x); +GLAPI PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s; +#define glVertexAttrib1s glad_glVertexAttrib1s +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv; +#define glVertexAttrib1sv glad_glVertexAttrib1sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC)(GLuint index, GLdouble x, GLdouble y); +GLAPI PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d; +#define glVertexAttrib2d glad_glVertexAttrib2d +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv; +#define glVertexAttrib2dv glad_glVertexAttrib2dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC)(GLuint index, GLfloat x, GLfloat y); +GLAPI PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f; +#define glVertexAttrib2f glad_glVertexAttrib2f +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv; +#define glVertexAttrib2fv glad_glVertexAttrib2fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC)(GLuint index, GLshort x, GLshort y); +GLAPI PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s; +#define glVertexAttrib2s glad_glVertexAttrib2s +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv; +#define glVertexAttrib2sv glad_glVertexAttrib2sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d; +#define glVertexAttrib3d glad_glVertexAttrib3d +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv; +#define glVertexAttrib3dv glad_glVertexAttrib3dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f; +#define glVertexAttrib3f glad_glVertexAttrib3f +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv; +#define glVertexAttrib3fv glad_glVertexAttrib3fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC)(GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s; +#define glVertexAttrib3s glad_glVertexAttrib3s +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv; +#define glVertexAttrib3sv glad_glVertexAttrib3sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv; +#define glVertexAttrib4Nbv glad_glVertexAttrib4Nbv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv; +#define glVertexAttrib4Niv glad_glVertexAttrib4Niv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv; +#define glVertexAttrib4Nsv glad_glVertexAttrib4Nsv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC)(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub; +#define glVertexAttrib4Nub glad_glVertexAttrib4Nub +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv; +#define glVertexAttrib4Nubv glad_glVertexAttrib4Nubv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv; +#define glVertexAttrib4Nuiv glad_glVertexAttrib4Nuiv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv; +#define glVertexAttrib4Nusv glad_glVertexAttrib4Nusv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv; +#define glVertexAttrib4bv glad_glVertexAttrib4bv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d; +#define glVertexAttrib4d glad_glVertexAttrib4d +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv; +#define glVertexAttrib4dv glad_glVertexAttrib4dv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f; +#define glVertexAttrib4f glad_glVertexAttrib4f +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv; +#define glVertexAttrib4fv glad_glVertexAttrib4fv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv; +#define glVertexAttrib4iv glad_glVertexAttrib4iv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC)(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s; +#define glVertexAttrib4s glad_glVertexAttrib4s +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv; +#define glVertexAttrib4sv glad_glVertexAttrib4sv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv; +#define glVertexAttrib4ubv glad_glVertexAttrib4ubv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv; +#define glVertexAttrib4uiv glad_glVertexAttrib4uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv; +#define glVertexAttrib4usv glad_glVertexAttrib4usv +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer; +#define glVertexAttribPointer glad_glVertexAttribPointer +#endif +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +GLAPI int GLAD_GL_VERSION_2_1; +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv; +#define glUniformMatrix2x3fv glad_glUniformMatrix2x3fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv; +#define glUniformMatrix3x2fv glad_glUniformMatrix3x2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv; +#define glUniformMatrix2x4fv glad_glUniformMatrix2x4fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv; +#define glUniformMatrix4x2fv glad_glUniformMatrix4x2fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv; +#define glUniformMatrix3x4fv glad_glUniformMatrix3x4fv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv; +#define glUniformMatrix4x3fv glad_glUniformMatrix4x3fv +#endif +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +GLAPI int GLAD_GL_VERSION_3_0; +typedef void (APIENTRYP PFNGLCOLORMASKIPROC)(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI PFNGLCOLORMASKIPROC glad_glColorMaski; +#define glColorMaski glad_glColorMaski +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC)(GLenum target, GLuint index, GLboolean *data); +GLAPI PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v; +#define glGetBooleani_v glad_glGetBooleani_v +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC)(GLenum target, GLuint index, GLint *data); +GLAPI PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v; +#define glGetIntegeri_v glad_glGetIntegeri_v +typedef void (APIENTRYP PFNGLENABLEIPROC)(GLenum target, GLuint index); +GLAPI PFNGLENABLEIPROC glad_glEnablei; +#define glEnablei glad_glEnablei +typedef void (APIENTRYP PFNGLDISABLEIPROC)(GLenum target, GLuint index); +GLAPI PFNGLDISABLEIPROC glad_glDisablei; +#define glDisablei glad_glDisablei +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC)(GLenum target, GLuint index); +GLAPI PFNGLISENABLEDIPROC glad_glIsEnabledi; +#define glIsEnabledi glad_glIsEnabledi +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC)(GLenum primitiveMode); +GLAPI PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback; +#define glBeginTransformFeedback glad_glBeginTransformFeedback +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC)(void); +GLAPI PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback; +#define glEndTransformFeedback glad_glEndTransformFeedback +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC)(GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange; +#define glBindBufferRange glad_glBindBufferRange +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC)(GLenum target, GLuint index, GLuint buffer); +GLAPI PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase; +#define glBindBufferBase glad_glBindBufferBase +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC)(GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings; +#define glTransformFeedbackVaryings glad_glTransformFeedbackVaryings +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)(GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying; +#define glGetTransformFeedbackVarying glad_glGetTransformFeedbackVarying +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC)(GLenum target, GLenum clamp); +GLAPI PFNGLCLAMPCOLORPROC glad_glClampColor; +#define glClampColor glad_glClampColor +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC)(GLuint id, GLenum mode); +GLAPI PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender; +#define glBeginConditionalRender glad_glBeginConditionalRender +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC)(void); +GLAPI PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender; +#define glEndConditionalRender glad_glEndConditionalRender +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer; +#define glVertexAttribIPointer glad_glVertexAttribIPointer +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC)(GLuint index, GLenum pname, GLint *params); +GLAPI PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv; +#define glGetVertexAttribIiv glad_glGetVertexAttribIiv +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC)(GLuint index, GLenum pname, GLuint *params); +GLAPI PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv; +#define glGetVertexAttribIuiv glad_glGetVertexAttribIuiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC)(GLuint index, GLint x); +GLAPI PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i; +#define glVertexAttribI1i glad_glVertexAttribI1i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC)(GLuint index, GLint x, GLint y); +GLAPI PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i; +#define glVertexAttribI2i glad_glVertexAttribI2i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC)(GLuint index, GLint x, GLint y, GLint z); +GLAPI PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i; +#define glVertexAttribI3i glad_glVertexAttribI3i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC)(GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i; +#define glVertexAttribI4i glad_glVertexAttribI4i +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC)(GLuint index, GLuint x); +GLAPI PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui; +#define glVertexAttribI1ui glad_glVertexAttribI1ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC)(GLuint index, GLuint x, GLuint y); +GLAPI PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui; +#define glVertexAttribI2ui glad_glVertexAttribI2ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui; +#define glVertexAttribI3ui glad_glVertexAttribI3ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC)(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui; +#define glVertexAttribI4ui glad_glVertexAttribI4ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv; +#define glVertexAttribI1iv glad_glVertexAttribI1iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv; +#define glVertexAttribI2iv glad_glVertexAttribI2iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv; +#define glVertexAttribI3iv glad_glVertexAttribI3iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv; +#define glVertexAttribI4iv glad_glVertexAttribI4iv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv; +#define glVertexAttribI1uiv glad_glVertexAttribI1uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv; +#define glVertexAttribI2uiv glad_glVertexAttribI2uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv; +#define glVertexAttribI3uiv glad_glVertexAttribI3uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC)(GLuint index, const GLuint *v); +GLAPI PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv; +#define glVertexAttribI4uiv glad_glVertexAttribI4uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC)(GLuint index, const GLbyte *v); +GLAPI PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv; +#define glVertexAttribI4bv glad_glVertexAttribI4bv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC)(GLuint index, const GLshort *v); +GLAPI PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv; +#define glVertexAttribI4sv glad_glVertexAttribI4sv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC)(GLuint index, const GLubyte *v); +GLAPI PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv; +#define glVertexAttribI4ubv glad_glVertexAttribI4ubv +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC)(GLuint index, const GLushort *v); +GLAPI PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv; +#define glVertexAttribI4usv glad_glVertexAttribI4usv +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC)(GLuint program, GLint location, GLuint *params); +GLAPI PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv; +#define glGetUniformuiv glad_glGetUniformuiv +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC)(GLuint program, GLuint color, const GLchar *name); +GLAPI PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation; +#define glBindFragDataLocation glad_glBindFragDataLocation +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation; +#define glGetFragDataLocation glad_glGetFragDataLocation +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC)(GLint location, GLuint v0); +GLAPI PFNGLUNIFORM1UIPROC glad_glUniform1ui; +#define glUniform1ui glad_glUniform1ui +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC)(GLint location, GLuint v0, GLuint v1); +GLAPI PFNGLUNIFORM2UIPROC glad_glUniform2ui; +#define glUniform2ui glad_glUniform2ui +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI PFNGLUNIFORM3UIPROC glad_glUniform3ui; +#define glUniform3ui glad_glUniform3ui +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC)(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI PFNGLUNIFORM4UIPROC glad_glUniform4ui; +#define glUniform4ui glad_glUniform4ui +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM1UIVPROC glad_glUniform1uiv; +#define glUniform1uiv glad_glUniform1uiv +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM2UIVPROC glad_glUniform2uiv; +#define glUniform2uiv glad_glUniform2uiv +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM3UIVPROC glad_glUniform3uiv; +#define glUniform3uiv glad_glUniform3uiv +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC)(GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLUNIFORM4UIVPROC glad_glUniform4uiv; +#define glUniform4uiv glad_glUniform4uiv +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, const GLint *params); +GLAPI PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv; +#define glTexParameterIiv glad_glTexParameterIiv +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, const GLuint *params); +GLAPI PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv; +#define glTexParameterIuiv glad_glTexParameterIuiv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv; +#define glGetTexParameterIiv glad_glGetTexParameterIiv +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC)(GLenum target, GLenum pname, GLuint *params); +GLAPI PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv; +#define glGetTexParameterIuiv glad_glGetTexParameterIuiv +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC)(GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv; +#define glClearBufferiv glad_glClearBufferiv +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC)(GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv; +#define glClearBufferuiv glad_glClearBufferuiv +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC)(GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv; +#define glClearBufferfv glad_glClearBufferfv +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC)(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi; +#define glClearBufferfi glad_glClearBufferfi +typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGIPROC)(GLenum name, GLuint index); +GLAPI PFNGLGETSTRINGIPROC glad_glGetStringi; +#define glGetStringi glad_glGetStringi +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC)(GLuint renderbuffer); +GLAPI PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer; +#define glIsRenderbuffer glad_glIsRenderbuffer +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC)(GLenum target, GLuint renderbuffer); +GLAPI PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer; +#define glBindRenderbuffer glad_glBindRenderbuffer +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC)(GLsizei n, const GLuint *renderbuffers); +GLAPI PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers; +#define glDeleteRenderbuffers glad_glDeleteRenderbuffers +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC)(GLsizei n, GLuint *renderbuffers); +GLAPI PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers; +#define glGenRenderbuffers glad_glGenRenderbuffers +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage; +#define glRenderbufferStorage glad_glRenderbufferStorage +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv; +#define glGetRenderbufferParameteriv glad_glGetRenderbufferParameteriv +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC)(GLuint framebuffer); +GLAPI PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer; +#define glIsFramebuffer glad_glIsFramebuffer +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC)(GLenum target, GLuint framebuffer); +GLAPI PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer; +#define glBindFramebuffer glad_glBindFramebuffer +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC)(GLsizei n, const GLuint *framebuffers); +GLAPI PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers; +#define glDeleteFramebuffers glad_glDeleteFramebuffers +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC)(GLsizei n, GLuint *framebuffers); +GLAPI PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers; +#define glGenFramebuffers glad_glGenFramebuffers +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC)(GLenum target); +GLAPI PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus; +#define glCheckFramebufferStatus glad_glCheckFramebufferStatus +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D; +#define glFramebufferTexture1D glad_glFramebufferTexture1D +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D; +#define glFramebufferTexture2D glad_glFramebufferTexture2D +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D; +#define glFramebufferTexture3D glad_glFramebufferTexture3D +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer; +#define glFramebufferRenderbuffer glad_glFramebufferRenderbuffer +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)(GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv; +#define glGetFramebufferAttachmentParameteriv glad_glGetFramebufferAttachmentParameteriv +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC)(GLenum target); +GLAPI PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap; +#define glGenerateMipmap glad_glGenerateMipmap +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer; +#define glBlitFramebuffer glad_glBlitFramebuffer +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample; +#define glRenderbufferStorageMultisample glad_glRenderbufferStorageMultisample +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer; +#define glFramebufferTextureLayer glad_glFramebufferTextureLayer +typedef void * (APIENTRYP PFNGLMAPBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange; +#define glMapBufferRange glad_glMapBufferRange +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC)(GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange; +#define glFlushMappedBufferRange glad_glFlushMappedBufferRange +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC)(GLuint array); +GLAPI PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray; +#define glBindVertexArray glad_glBindVertexArray +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC)(GLsizei n, const GLuint *arrays); +GLAPI PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays; +#define glDeleteVertexArrays glad_glDeleteVertexArrays +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC)(GLsizei n, GLuint *arrays); +GLAPI PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays; +#define glGenVertexArrays glad_glGenVertexArrays +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC)(GLuint array); +GLAPI PFNGLISVERTEXARRAYPROC glad_glIsVertexArray; +#define glIsVertexArray glad_glIsVertexArray +#endif +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +GLAPI int GLAD_GL_VERSION_3_1; +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced; +#define glDrawArraysInstanced glad_glDrawArraysInstanced +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced; +#define glDrawElementsInstanced glad_glDrawElementsInstanced +typedef void (APIENTRYP PFNGLTEXBUFFERPROC)(GLenum target, GLenum internalformat, GLuint buffer); +GLAPI PFNGLTEXBUFFERPROC glad_glTexBuffer; +#define glTexBuffer glad_glTexBuffer +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC)(GLuint index); +GLAPI PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex; +#define glPrimitiveRestartIndex glad_glPrimitiveRestartIndex +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC)(GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData; +#define glCopyBufferSubData glad_glCopyBufferSubData +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC)(GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices; +#define glGetUniformIndices glad_glGetUniformIndices +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC)(GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv; +#define glGetActiveUniformsiv glad_glGetActiveUniformsiv +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC)(GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName; +#define glGetActiveUniformName glad_glGetActiveUniformName +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC)(GLuint program, const GLchar *uniformBlockName); +GLAPI PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex; +#define glGetUniformBlockIndex glad_glGetUniformBlockIndex +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC)(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv; +#define glGetActiveUniformBlockiv glad_glGetActiveUniformBlockiv +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)(GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName; +#define glGetActiveUniformBlockName glad_glGetActiveUniformBlockName +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +GLAPI PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding; +#define glUniformBlockBinding glad_glUniformBlockBinding +#endif +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +GLAPI int GLAD_GL_VERSION_3_2; +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex; +#define glDrawElementsBaseVertex glad_glDrawElementsBaseVertex +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex; +#define glDrawRangeElementsBaseVertex glad_glDrawRangeElementsBaseVertex +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex; +#define glDrawElementsInstancedBaseVertex glad_glDrawElementsInstancedBaseVertex +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)(GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex; +#define glMultiDrawElementsBaseVertex glad_glMultiDrawElementsBaseVertex +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC)(GLenum mode); +GLAPI PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex; +#define glProvokingVertex glad_glProvokingVertex +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC)(GLenum condition, GLbitfield flags); +GLAPI PFNGLFENCESYNCPROC glad_glFenceSync; +#define glFenceSync glad_glFenceSync +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC)(GLsync sync); +GLAPI PFNGLISSYNCPROC glad_glIsSync; +#define glIsSync glad_glIsSync +typedef void (APIENTRYP PFNGLDELETESYNCPROC)(GLsync sync); +GLAPI PFNGLDELETESYNCPROC glad_glDeleteSync; +#define glDeleteSync glad_glDeleteSync +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync; +#define glClientWaitSync glad_glClientWaitSync +typedef void (APIENTRYP PFNGLWAITSYNCPROC)(GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI PFNGLWAITSYNCPROC glad_glWaitSync; +#define glWaitSync glad_glWaitSync +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC)(GLenum pname, GLint64 *data); +GLAPI PFNGLGETINTEGER64VPROC glad_glGetInteger64v; +#define glGetInteger64v glad_glGetInteger64v +typedef void (APIENTRYP PFNGLGETSYNCIVPROC)(GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI PFNGLGETSYNCIVPROC glad_glGetSynciv; +#define glGetSynciv glad_glGetSynciv +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC)(GLenum target, GLuint index, GLint64 *data); +GLAPI PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v; +#define glGetInteger64i_v glad_glGetInteger64i_v +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC)(GLenum target, GLenum pname, GLint64 *params); +GLAPI PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v; +#define glGetBufferParameteri64v glad_glGetBufferParameteri64v +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC)(GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture; +#define glFramebufferTexture glad_glFramebufferTexture +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample; +#define glTexImage2DMultisample glad_glTexImage2DMultisample +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample; +#define glTexImage3DMultisample glad_glTexImage3DMultisample +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC)(GLenum pname, GLuint index, GLfloat *val); +GLAPI PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv; +#define glGetMultisamplefv glad_glGetMultisamplefv +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC)(GLuint maskNumber, GLbitfield mask); +GLAPI PFNGLSAMPLEMASKIPROC glad_glSampleMaski; +#define glSampleMaski glad_glSampleMaski +#endif +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +GLAPI int GLAD_GL_VERSION_3_3; +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)(GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed; +#define glBindFragDataLocationIndexed glad_glBindFragDataLocationIndexed +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC)(GLuint program, const GLchar *name); +GLAPI PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex; +#define glGetFragDataIndex glad_glGetFragDataIndex +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC)(GLsizei count, GLuint *samplers); +GLAPI PFNGLGENSAMPLERSPROC glad_glGenSamplers; +#define glGenSamplers glad_glGenSamplers +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC)(GLsizei count, const GLuint *samplers); +GLAPI PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers; +#define glDeleteSamplers glad_glDeleteSamplers +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC)(GLuint sampler); +GLAPI PFNGLISSAMPLERPROC glad_glIsSampler; +#define glIsSampler glad_glIsSampler +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC)(GLuint unit, GLuint sampler); +GLAPI PFNGLBINDSAMPLERPROC glad_glBindSampler; +#define glBindSampler glad_glBindSampler +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC)(GLuint sampler, GLenum pname, GLint param); +GLAPI PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri; +#define glSamplerParameteri glad_glSamplerParameteri +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, const GLint *param); +GLAPI PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv; +#define glSamplerParameteriv glad_glSamplerParameteriv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC)(GLuint sampler, GLenum pname, GLfloat param); +GLAPI PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf; +#define glSamplerParameterf glad_glSamplerParameterf +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv; +#define glSamplerParameterfv glad_glSamplerParameterfv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, const GLint *param); +GLAPI PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv; +#define glSamplerParameterIiv glad_glSamplerParameterIiv +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, const GLuint *param); +GLAPI PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv; +#define glSamplerParameterIuiv glad_glSamplerParameterIuiv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC)(GLuint sampler, GLenum pname, GLint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv; +#define glGetSamplerParameteriv glad_glGetSamplerParameteriv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC)(GLuint sampler, GLenum pname, GLint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv; +#define glGetSamplerParameterIiv glad_glGetSamplerParameterIiv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC)(GLuint sampler, GLenum pname, GLfloat *params); +GLAPI PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv; +#define glGetSamplerParameterfv glad_glGetSamplerParameterfv +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC)(GLuint sampler, GLenum pname, GLuint *params); +GLAPI PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv; +#define glGetSamplerParameterIuiv glad_glGetSamplerParameterIuiv +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC)(GLuint id, GLenum target); +GLAPI PFNGLQUERYCOUNTERPROC glad_glQueryCounter; +#define glQueryCounter glad_glQueryCounter +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC)(GLuint id, GLenum pname, GLint64 *params); +GLAPI PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v; +#define glGetQueryObjecti64v glad_glGetQueryObjecti64v +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC)(GLuint id, GLenum pname, GLuint64 *params); +GLAPI PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v; +#define glGetQueryObjectui64v glad_glGetQueryObjectui64v +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC)(GLuint index, GLuint divisor); +GLAPI PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor; +#define glVertexAttribDivisor glad_glVertexAttribDivisor +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui; +#define glVertexAttribP1ui glad_glVertexAttribP1ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv; +#define glVertexAttribP1uiv glad_glVertexAttribP1uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui; +#define glVertexAttribP2ui glad_glVertexAttribP2ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv; +#define glVertexAttribP2uiv glad_glVertexAttribP2uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui; +#define glVertexAttribP3ui glad_glVertexAttribP3ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv; +#define glVertexAttribP3uiv glad_glVertexAttribP3uiv +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC)(GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui; +#define glVertexAttribP4ui glad_glVertexAttribP4ui +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC)(GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv; +#define glVertexAttribP4uiv glad_glVertexAttribP4uiv +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP2UIPROC glad_glVertexP2ui; +#define glVertexP2ui glad_glVertexP2ui +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv; +#define glVertexP2uiv glad_glVertexP2uiv +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP3UIPROC glad_glVertexP3ui; +#define glVertexP3ui glad_glVertexP3ui +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv; +#define glVertexP3uiv glad_glVertexP3uiv +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC)(GLenum type, GLuint value); +GLAPI PFNGLVERTEXP4UIPROC glad_glVertexP4ui; +#define glVertexP4ui glad_glVertexP4ui +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC)(GLenum type, const GLuint *value); +GLAPI PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv; +#define glVertexP4uiv glad_glVertexP4uiv +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui; +#define glTexCoordP1ui glad_glTexCoordP1ui +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv; +#define glTexCoordP1uiv glad_glTexCoordP1uiv +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui; +#define glTexCoordP2ui glad_glTexCoordP2ui +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv; +#define glTexCoordP2uiv glad_glTexCoordP2uiv +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui; +#define glTexCoordP3ui glad_glTexCoordP3ui +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv; +#define glTexCoordP3uiv glad_glTexCoordP3uiv +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui; +#define glTexCoordP4ui glad_glTexCoordP4ui +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv; +#define glTexCoordP4uiv glad_glTexCoordP4uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui; +#define glMultiTexCoordP1ui glad_glMultiTexCoordP1ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv; +#define glMultiTexCoordP1uiv glad_glMultiTexCoordP1uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui; +#define glMultiTexCoordP2ui glad_glMultiTexCoordP2ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv; +#define glMultiTexCoordP2uiv glad_glMultiTexCoordP2uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui; +#define glMultiTexCoordP3ui glad_glMultiTexCoordP3ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv; +#define glMultiTexCoordP3uiv glad_glMultiTexCoordP3uiv +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC)(GLenum texture, GLenum type, GLuint coords); +GLAPI PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui; +#define glMultiTexCoordP4ui glad_glMultiTexCoordP4ui +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC)(GLenum texture, GLenum type, const GLuint *coords); +GLAPI PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv; +#define glMultiTexCoordP4uiv glad_glMultiTexCoordP4uiv +typedef void (APIENTRYP PFNGLNORMALP3UIPROC)(GLenum type, GLuint coords); +GLAPI PFNGLNORMALP3UIPROC glad_glNormalP3ui; +#define glNormalP3ui glad_glNormalP3ui +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC)(GLenum type, const GLuint *coords); +GLAPI PFNGLNORMALP3UIVPROC glad_glNormalP3uiv; +#define glNormalP3uiv glad_glNormalP3uiv +typedef void (APIENTRYP PFNGLCOLORP3UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLCOLORP3UIPROC glad_glColorP3ui; +#define glColorP3ui glad_glColorP3ui +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLCOLORP3UIVPROC glad_glColorP3uiv; +#define glColorP3uiv glad_glColorP3uiv +typedef void (APIENTRYP PFNGLCOLORP4UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLCOLORP4UIPROC glad_glColorP4ui; +#define glColorP4ui glad_glColorP4ui +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLCOLORP4UIVPROC glad_glColorP4uiv; +#define glColorP4uiv glad_glColorP4uiv +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC)(GLenum type, GLuint color); +GLAPI PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui; +#define glSecondaryColorP3ui glad_glSecondaryColorP3ui +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint *color); +GLAPI PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; +#define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/glad.c b/src/glad.c new file mode 100644 index 0000000..781ad9e --- /dev/null +++ b/src/glad.c @@ -0,0 +1,1140 @@ +/* + + OpenGL loader generated by glad 0.1.36 on Sun Nov 9 22:34:23 2025. + + Language/Generator: C/C++ + Specification: gl + APIs: gl=3.3 + Profile: core + Extensions: + + Loader: True + Local files: False + Omit khrplatform: False + Reproducible: False + + Commandline: + --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" + Online: + https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 +*/ + +#include +#include +#include +#include + +static void* get_proc(const char *namez); + +#if defined(_WIN32) || defined(__CYGWIN__) +#ifndef _WINDOWS_ +#undef APIENTRY +#endif +#include +static HMODULE libGL; + +typedef void* (APIENTRYP PFNWGLGETPROCADDRESSPROC_PRIVATE)(const char*); +static PFNWGLGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; + +#ifdef _MSC_VER +#ifdef __has_include + #if __has_include() + #define HAVE_WINAPIFAMILY 1 + #endif +#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define HAVE_WINAPIFAMILY 1 +#endif +#endif + +#ifdef HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define IS_UWP 1 + #endif +#endif + +static +int open_gl(void) { +#ifndef IS_UWP + libGL = LoadLibraryW(L"opengl32.dll"); + if(libGL != NULL) { + void (* tmp)(void); + tmp = (void(*)(void)) GetProcAddress(libGL, "wglGetProcAddress"); + gladGetProcAddressPtr = (PFNWGLGETPROCADDRESSPROC_PRIVATE) tmp; + return gladGetProcAddressPtr != NULL; + } +#endif + + return 0; +} + +static +void close_gl(void) { + if(libGL != NULL) { + FreeLibrary((HMODULE) libGL); + libGL = NULL; + } +} +#else +#include +static void* libGL; + +#if !defined(__APPLE__) && !defined(__HAIKU__) +typedef void* (APIENTRYP PFNGLXGETPROCADDRESSPROC_PRIVATE)(const char*); +static PFNGLXGETPROCADDRESSPROC_PRIVATE gladGetProcAddressPtr; +#endif + +static +int open_gl(void) { +#ifdef __APPLE__ + static const char *NAMES[] = { + "../Frameworks/OpenGL.framework/OpenGL", + "/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/OpenGL", + "/System/Library/Frameworks/OpenGL.framework/Versions/Current/OpenGL" + }; +#else + static const char *NAMES[] = {"libGL.so.1", "libGL.so"}; +#endif + + unsigned int index = 0; + for(index = 0; index < (sizeof(NAMES) / sizeof(NAMES[0])); index++) { + libGL = dlopen(NAMES[index], RTLD_NOW | RTLD_GLOBAL); + + if(libGL != NULL) { +#if defined(__APPLE__) || defined(__HAIKU__) + return 1; +#else + gladGetProcAddressPtr = (PFNGLXGETPROCADDRESSPROC_PRIVATE)dlsym(libGL, + "glXGetProcAddressARB"); + return gladGetProcAddressPtr != NULL; +#endif + } + } + + return 0; +} + +static +void close_gl(void) { + if(libGL != NULL) { + dlclose(libGL); + libGL = NULL; + } +} +#endif + +static +void* get_proc(const char *namez) { + void* result = NULL; + if(libGL == NULL) return NULL; + +#if !defined(__APPLE__) && !defined(__HAIKU__) + if(gladGetProcAddressPtr != NULL) { + result = gladGetProcAddressPtr(namez); + } +#endif + if(result == NULL) { +#if defined(_WIN32) || defined(__CYGWIN__) + result = (void*)GetProcAddress((HMODULE) libGL, namez); +#else + result = dlsym(libGL, namez); +#endif + } + + return result; +} + +int gladLoadGL(void) { + int status = 0; + + if(open_gl()) { + status = gladLoadGLLoader(&get_proc); + close_gl(); + } + + return status; +} + +struct gladGLversionStruct GLVersion = { 0, 0 }; + +#if defined(GL_ES_VERSION_3_0) || defined(GL_VERSION_3_0) +#define _GLAD_IS_SOME_NEW_VERSION 1 +#endif + +static int max_loaded_major; +static int max_loaded_minor; + +static const char *exts = NULL; +static int num_exts_i = 0; +static char **exts_i = NULL; + +static int get_exts(void) { +#ifdef _GLAD_IS_SOME_NEW_VERSION + if(max_loaded_major < 3) { +#endif + exts = (const char *)glGetString(GL_EXTENSIONS); +#ifdef _GLAD_IS_SOME_NEW_VERSION + } else { + int index; + + num_exts_i = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_exts_i); + if (num_exts_i > 0) { + exts_i = (char **)malloc((size_t)num_exts_i * (sizeof *exts_i)); + } + + if (exts_i == NULL) { + return 0; + } + + for(index = 0; index < num_exts_i; index++) { + const char *gl_str_tmp = (const char*)glGetStringi(GL_EXTENSIONS, index); + size_t len = strlen(gl_str_tmp); + + char *local_str = (char*)malloc((len+1) * sizeof(char)); + if(local_str != NULL) { + memcpy(local_str, gl_str_tmp, (len+1) * sizeof(char)); + } + exts_i[index] = local_str; + } + } +#endif + return 1; +} + +static void free_exts(void) { + if (exts_i != NULL) { + int index; + for(index = 0; index < num_exts_i; index++) { + free((char *)exts_i[index]); + } + free((void *)exts_i); + exts_i = NULL; + } +} + +static int has_ext(const char *ext) { +#ifdef _GLAD_IS_SOME_NEW_VERSION + if(max_loaded_major < 3) { +#endif + const char *extensions; + const char *loc; + const char *terminator; + extensions = exts; + if(extensions == NULL || ext == NULL) { + return 0; + } + + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) { + return 0; + } + + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } +#ifdef _GLAD_IS_SOME_NEW_VERSION + } else { + int index; + if(exts_i == NULL) return 0; + for(index = 0; index < num_exts_i; index++) { + const char *e = exts_i[index]; + + if(exts_i[index] != NULL && strcmp(e, ext) == 0) { + return 1; + } + } + } +#endif + + return 0; +} +int GLAD_GL_VERSION_1_0 = 0; +int GLAD_GL_VERSION_1_1 = 0; +int GLAD_GL_VERSION_1_2 = 0; +int GLAD_GL_VERSION_1_3 = 0; +int GLAD_GL_VERSION_1_4 = 0; +int GLAD_GL_VERSION_1_5 = 0; +int GLAD_GL_VERSION_2_0 = 0; +int GLAD_GL_VERSION_2_1 = 0; +int GLAD_GL_VERSION_3_0 = 0; +int GLAD_GL_VERSION_3_1 = 0; +int GLAD_GL_VERSION_3_2 = 0; +int GLAD_GL_VERSION_3_3 = 0; +PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; +PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; +PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; +PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; +PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; +PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; +PFNGLBINDBUFFERBASEPROC glad_glBindBufferBase = NULL; +PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; +PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; +PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; +PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; +PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; +PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; +PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; +PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; +PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; +PFNGLBUFFERDATAPROC glad_glBufferData = NULL; +PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; +PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; +PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; +PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; +PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; +PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; +PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; +PFNGLCLEARCOLORPROC glad_glClearColor = NULL; +PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; +PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; +PFNGLCOLORMASKPROC glad_glColorMask = NULL; +PFNGLCOLORMASKIPROC glad_glColorMaski = NULL; +PFNGLCOLORP3UIPROC glad_glColorP3ui = NULL; +PFNGLCOLORP3UIVPROC glad_glColorP3uiv = NULL; +PFNGLCOLORP4UIPROC glad_glColorP4ui = NULL; +PFNGLCOLORP4UIVPROC glad_glColorP4uiv = NULL; +PFNGLCOMPILESHADERPROC glad_glCompileShader = NULL; +PFNGLCOMPRESSEDTEXIMAGE1DPROC glad_glCompressedTexImage1D = NULL; +PFNGLCOMPRESSEDTEXIMAGE2DPROC glad_glCompressedTexImage2D = NULL; +PFNGLCOMPRESSEDTEXIMAGE3DPROC glad_glCompressedTexImage3D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; +PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; +PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; +PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; +PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; +PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; +PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; +PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; +PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; +PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; +PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; +PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; +PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; +PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; +PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; +PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; +PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; +PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; +PFNGLDISABLEPROC glad_glDisable = NULL; +PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; +PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; +PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; +PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; +PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; +PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLENABLEPROC glad_glEnable = NULL; +PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; +PFNGLENABLEIPROC glad_glEnablei = NULL; +PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; +PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; +PFNGLFENCESYNCPROC glad_glFenceSync = NULL; +PFNGLFINISHPROC glad_glFinish = NULL; +PFNGLFLUSHPROC glad_glFlush = NULL; +PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; +PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; +PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; +PFNGLFRAMEBUFFERTEXTURE2DPROC glad_glFramebufferTexture2D = NULL; +PFNGLFRAMEBUFFERTEXTURE3DPROC glad_glFramebufferTexture3D = NULL; +PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; +PFNGLFRONTFACEPROC glad_glFrontFace = NULL; +PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; +PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENQUERIESPROC glad_glGenQueries = NULL; +PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; +PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; +PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; +PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; +PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; +PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; +PFNGLGETACTIVEUNIFORMNAMEPROC glad_glGetActiveUniformName = NULL; +PFNGLGETACTIVEUNIFORMSIVPROC glad_glGetActiveUniformsiv = NULL; +PFNGLGETATTACHEDSHADERSPROC glad_glGetAttachedShaders = NULL; +PFNGLGETATTRIBLOCATIONPROC glad_glGetAttribLocation = NULL; +PFNGLGETBOOLEANI_VPROC glad_glGetBooleani_v = NULL; +PFNGLGETBOOLEANVPROC glad_glGetBooleanv = NULL; +PFNGLGETBUFFERPARAMETERI64VPROC glad_glGetBufferParameteri64v = NULL; +PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; +PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; +PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; +PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; +PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; +PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; +PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; +PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; +PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; +PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; +PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; +PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; +PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; +PFNGLGETQUERYOBJECTUIVPROC glad_glGetQueryObjectuiv = NULL; +PFNGLGETQUERYIVPROC glad_glGetQueryiv = NULL; +PFNGLGETRENDERBUFFERPARAMETERIVPROC glad_glGetRenderbufferParameteriv = NULL; +PFNGLGETSAMPLERPARAMETERIIVPROC glad_glGetSamplerParameterIiv = NULL; +PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; +PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; +PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; +PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; +PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; +PFNGLGETSTRINGPROC glad_glGetString = NULL; +PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; +PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; +PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; +PFNGLGETTEXLEVELPARAMETERIVPROC glad_glGetTexLevelParameteriv = NULL; +PFNGLGETTEXPARAMETERIIVPROC glad_glGetTexParameterIiv = NULL; +PFNGLGETTEXPARAMETERIUIVPROC glad_glGetTexParameterIuiv = NULL; +PFNGLGETTEXPARAMETERFVPROC glad_glGetTexParameterfv = NULL; +PFNGLGETTEXPARAMETERIVPROC glad_glGetTexParameteriv = NULL; +PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; +PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; +PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; +PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; +PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; +PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; +PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; +PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; +PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; +PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; +PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; +PFNGLHINTPROC glad_glHint = NULL; +PFNGLISBUFFERPROC glad_glIsBuffer = NULL; +PFNGLISENABLEDPROC glad_glIsEnabled = NULL; +PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; +PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; +PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISQUERYPROC glad_glIsQuery = NULL; +PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; +PFNGLISSAMPLERPROC glad_glIsSampler = NULL; +PFNGLISSHADERPROC glad_glIsShader = NULL; +PFNGLISSYNCPROC glad_glIsSync = NULL; +PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; +PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; +PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; +PFNGLLOGICOPPROC glad_glLogicOp = NULL; +PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; +PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; +PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; +PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; +PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; +PFNGLMULTITEXCOORDP2UIVPROC glad_glMultiTexCoordP2uiv = NULL; +PFNGLMULTITEXCOORDP3UIPROC glad_glMultiTexCoordP3ui = NULL; +PFNGLMULTITEXCOORDP3UIVPROC glad_glMultiTexCoordP3uiv = NULL; +PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; +PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; +PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; +PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; +PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; +PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; +PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; +PFNGLPOINTPARAMETERFVPROC glad_glPointParameterfv = NULL; +PFNGLPOINTPARAMETERIPROC glad_glPointParameteri = NULL; +PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; +PFNGLPOINTSIZEPROC glad_glPointSize = NULL; +PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; +PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; +PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; +PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; +PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; +PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; +PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; +PFNGLSAMPLERPARAMETERIUIVPROC glad_glSamplerParameterIuiv = NULL; +PFNGLSAMPLERPARAMETERFPROC glad_glSamplerParameterf = NULL; +PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; +PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; +PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; +PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; +PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; +PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; +PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; +PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; +PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; +PFNGLSTENCILOPPROC glad_glStencilOp = NULL; +PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; +PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; +PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; +PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; +PFNGLTEXCOORDP2UIVPROC glad_glTexCoordP2uiv = NULL; +PFNGLTEXCOORDP3UIPROC glad_glTexCoordP3ui = NULL; +PFNGLTEXCOORDP3UIVPROC glad_glTexCoordP3uiv = NULL; +PFNGLTEXCOORDP4UIPROC glad_glTexCoordP4ui = NULL; +PFNGLTEXCOORDP4UIVPROC glad_glTexCoordP4uiv = NULL; +PFNGLTEXIMAGE1DPROC glad_glTexImage1D = NULL; +PFNGLTEXIMAGE2DPROC glad_glTexImage2D = NULL; +PFNGLTEXIMAGE2DMULTISAMPLEPROC glad_glTexImage2DMultisample = NULL; +PFNGLTEXIMAGE3DPROC glad_glTexImage3D = NULL; +PFNGLTEXIMAGE3DMULTISAMPLEPROC glad_glTexImage3DMultisample = NULL; +PFNGLTEXPARAMETERIIVPROC glad_glTexParameterIiv = NULL; +PFNGLTEXPARAMETERIUIVPROC glad_glTexParameterIuiv = NULL; +PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; +PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; +PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; +PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; +PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; +PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; +PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; +PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; +PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; +PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; +PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; +PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; +PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; +PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; +PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; +PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; +PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; +PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; +PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; +PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; +PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; +PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; +PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; +PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; +PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; +PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; +PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; +PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; +PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; +PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; +PFNGLVERTEXATTRIB1FVPROC glad_glVertexAttrib1fv = NULL; +PFNGLVERTEXATTRIB1SPROC glad_glVertexAttrib1s = NULL; +PFNGLVERTEXATTRIB1SVPROC glad_glVertexAttrib1sv = NULL; +PFNGLVERTEXATTRIB2DPROC glad_glVertexAttrib2d = NULL; +PFNGLVERTEXATTRIB2DVPROC glad_glVertexAttrib2dv = NULL; +PFNGLVERTEXATTRIB2FPROC glad_glVertexAttrib2f = NULL; +PFNGLVERTEXATTRIB2FVPROC glad_glVertexAttrib2fv = NULL; +PFNGLVERTEXATTRIB2SPROC glad_glVertexAttrib2s = NULL; +PFNGLVERTEXATTRIB2SVPROC glad_glVertexAttrib2sv = NULL; +PFNGLVERTEXATTRIB3DPROC glad_glVertexAttrib3d = NULL; +PFNGLVERTEXATTRIB3DVPROC glad_glVertexAttrib3dv = NULL; +PFNGLVERTEXATTRIB3FPROC glad_glVertexAttrib3f = NULL; +PFNGLVERTEXATTRIB3FVPROC glad_glVertexAttrib3fv = NULL; +PFNGLVERTEXATTRIB3SPROC glad_glVertexAttrib3s = NULL; +PFNGLVERTEXATTRIB3SVPROC glad_glVertexAttrib3sv = NULL; +PFNGLVERTEXATTRIB4NBVPROC glad_glVertexAttrib4Nbv = NULL; +PFNGLVERTEXATTRIB4NIVPROC glad_glVertexAttrib4Niv = NULL; +PFNGLVERTEXATTRIB4NSVPROC glad_glVertexAttrib4Nsv = NULL; +PFNGLVERTEXATTRIB4NUBPROC glad_glVertexAttrib4Nub = NULL; +PFNGLVERTEXATTRIB4NUBVPROC glad_glVertexAttrib4Nubv = NULL; +PFNGLVERTEXATTRIB4NUIVPROC glad_glVertexAttrib4Nuiv = NULL; +PFNGLVERTEXATTRIB4NUSVPROC glad_glVertexAttrib4Nusv = NULL; +PFNGLVERTEXATTRIB4BVPROC glad_glVertexAttrib4bv = NULL; +PFNGLVERTEXATTRIB4DPROC glad_glVertexAttrib4d = NULL; +PFNGLVERTEXATTRIB4DVPROC glad_glVertexAttrib4dv = NULL; +PFNGLVERTEXATTRIB4FPROC glad_glVertexAttrib4f = NULL; +PFNGLVERTEXATTRIB4FVPROC glad_glVertexAttrib4fv = NULL; +PFNGLVERTEXATTRIB4IVPROC glad_glVertexAttrib4iv = NULL; +PFNGLVERTEXATTRIB4SPROC glad_glVertexAttrib4s = NULL; +PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; +PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; +PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; +PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; +PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; +PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; +PFNGLVERTEXATTRIBI1UIVPROC glad_glVertexAttribI1uiv = NULL; +PFNGLVERTEXATTRIBI2IPROC glad_glVertexAttribI2i = NULL; +PFNGLVERTEXATTRIBI2IVPROC glad_glVertexAttribI2iv = NULL; +PFNGLVERTEXATTRIBI2UIPROC glad_glVertexAttribI2ui = NULL; +PFNGLVERTEXATTRIBI2UIVPROC glad_glVertexAttribI2uiv = NULL; +PFNGLVERTEXATTRIBI3IPROC glad_glVertexAttribI3i = NULL; +PFNGLVERTEXATTRIBI3IVPROC glad_glVertexAttribI3iv = NULL; +PFNGLVERTEXATTRIBI3UIPROC glad_glVertexAttribI3ui = NULL; +PFNGLVERTEXATTRIBI3UIVPROC glad_glVertexAttribI3uiv = NULL; +PFNGLVERTEXATTRIBI4BVPROC glad_glVertexAttribI4bv = NULL; +PFNGLVERTEXATTRIBI4IPROC glad_glVertexAttribI4i = NULL; +PFNGLVERTEXATTRIBI4IVPROC glad_glVertexAttribI4iv = NULL; +PFNGLVERTEXATTRIBI4SVPROC glad_glVertexAttribI4sv = NULL; +PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; +PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; +PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; +PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; +PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; +PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; +PFNGLVERTEXATTRIBP2UIVPROC glad_glVertexAttribP2uiv = NULL; +PFNGLVERTEXATTRIBP3UIPROC glad_glVertexAttribP3ui = NULL; +PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; +PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; +PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; +PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; +PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; +PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; +PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; +PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; +PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; +PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLWAITSYNCPROC glad_glWaitSync = NULL; +static void load_GL_VERSION_1_0(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_0) return; + glad_glCullFace = (PFNGLCULLFACEPROC)load("glCullFace"); + glad_glFrontFace = (PFNGLFRONTFACEPROC)load("glFrontFace"); + glad_glHint = (PFNGLHINTPROC)load("glHint"); + glad_glLineWidth = (PFNGLLINEWIDTHPROC)load("glLineWidth"); + glad_glPointSize = (PFNGLPOINTSIZEPROC)load("glPointSize"); + glad_glPolygonMode = (PFNGLPOLYGONMODEPROC)load("glPolygonMode"); + glad_glScissor = (PFNGLSCISSORPROC)load("glScissor"); + glad_glTexParameterf = (PFNGLTEXPARAMETERFPROC)load("glTexParameterf"); + glad_glTexParameterfv = (PFNGLTEXPARAMETERFVPROC)load("glTexParameterfv"); + glad_glTexParameteri = (PFNGLTEXPARAMETERIPROC)load("glTexParameteri"); + glad_glTexParameteriv = (PFNGLTEXPARAMETERIVPROC)load("glTexParameteriv"); + glad_glTexImage1D = (PFNGLTEXIMAGE1DPROC)load("glTexImage1D"); + glad_glTexImage2D = (PFNGLTEXIMAGE2DPROC)load("glTexImage2D"); + glad_glDrawBuffer = (PFNGLDRAWBUFFERPROC)load("glDrawBuffer"); + glad_glClear = (PFNGLCLEARPROC)load("glClear"); + glad_glClearColor = (PFNGLCLEARCOLORPROC)load("glClearColor"); + glad_glClearStencil = (PFNGLCLEARSTENCILPROC)load("glClearStencil"); + glad_glClearDepth = (PFNGLCLEARDEPTHPROC)load("glClearDepth"); + glad_glStencilMask = (PFNGLSTENCILMASKPROC)load("glStencilMask"); + glad_glColorMask = (PFNGLCOLORMASKPROC)load("glColorMask"); + glad_glDepthMask = (PFNGLDEPTHMASKPROC)load("glDepthMask"); + glad_glDisable = (PFNGLDISABLEPROC)load("glDisable"); + glad_glEnable = (PFNGLENABLEPROC)load("glEnable"); + glad_glFinish = (PFNGLFINISHPROC)load("glFinish"); + glad_glFlush = (PFNGLFLUSHPROC)load("glFlush"); + glad_glBlendFunc = (PFNGLBLENDFUNCPROC)load("glBlendFunc"); + glad_glLogicOp = (PFNGLLOGICOPPROC)load("glLogicOp"); + glad_glStencilFunc = (PFNGLSTENCILFUNCPROC)load("glStencilFunc"); + glad_glStencilOp = (PFNGLSTENCILOPPROC)load("glStencilOp"); + glad_glDepthFunc = (PFNGLDEPTHFUNCPROC)load("glDepthFunc"); + glad_glPixelStoref = (PFNGLPIXELSTOREFPROC)load("glPixelStoref"); + glad_glPixelStorei = (PFNGLPIXELSTOREIPROC)load("glPixelStorei"); + glad_glReadBuffer = (PFNGLREADBUFFERPROC)load("glReadBuffer"); + glad_glReadPixels = (PFNGLREADPIXELSPROC)load("glReadPixels"); + glad_glGetBooleanv = (PFNGLGETBOOLEANVPROC)load("glGetBooleanv"); + glad_glGetDoublev = (PFNGLGETDOUBLEVPROC)load("glGetDoublev"); + glad_glGetError = (PFNGLGETERRORPROC)load("glGetError"); + glad_glGetFloatv = (PFNGLGETFLOATVPROC)load("glGetFloatv"); + glad_glGetIntegerv = (PFNGLGETINTEGERVPROC)load("glGetIntegerv"); + glad_glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); + glad_glGetTexImage = (PFNGLGETTEXIMAGEPROC)load("glGetTexImage"); + glad_glGetTexParameterfv = (PFNGLGETTEXPARAMETERFVPROC)load("glGetTexParameterfv"); + glad_glGetTexParameteriv = (PFNGLGETTEXPARAMETERIVPROC)load("glGetTexParameteriv"); + glad_glGetTexLevelParameterfv = (PFNGLGETTEXLEVELPARAMETERFVPROC)load("glGetTexLevelParameterfv"); + glad_glGetTexLevelParameteriv = (PFNGLGETTEXLEVELPARAMETERIVPROC)load("glGetTexLevelParameteriv"); + glad_glIsEnabled = (PFNGLISENABLEDPROC)load("glIsEnabled"); + glad_glDepthRange = (PFNGLDEPTHRANGEPROC)load("glDepthRange"); + glad_glViewport = (PFNGLVIEWPORTPROC)load("glViewport"); +} +static void load_GL_VERSION_1_1(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_1) return; + glad_glDrawArrays = (PFNGLDRAWARRAYSPROC)load("glDrawArrays"); + glad_glDrawElements = (PFNGLDRAWELEMENTSPROC)load("glDrawElements"); + glad_glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)load("glPolygonOffset"); + glad_glCopyTexImage1D = (PFNGLCOPYTEXIMAGE1DPROC)load("glCopyTexImage1D"); + glad_glCopyTexImage2D = (PFNGLCOPYTEXIMAGE2DPROC)load("glCopyTexImage2D"); + glad_glCopyTexSubImage1D = (PFNGLCOPYTEXSUBIMAGE1DPROC)load("glCopyTexSubImage1D"); + glad_glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)load("glCopyTexSubImage2D"); + glad_glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)load("glTexSubImage1D"); + glad_glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)load("glTexSubImage2D"); + glad_glBindTexture = (PFNGLBINDTEXTUREPROC)load("glBindTexture"); + glad_glDeleteTextures = (PFNGLDELETETEXTURESPROC)load("glDeleteTextures"); + glad_glGenTextures = (PFNGLGENTEXTURESPROC)load("glGenTextures"); + glad_glIsTexture = (PFNGLISTEXTUREPROC)load("glIsTexture"); +} +static void load_GL_VERSION_1_2(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_2) return; + glad_glDrawRangeElements = (PFNGLDRAWRANGEELEMENTSPROC)load("glDrawRangeElements"); + glad_glTexImage3D = (PFNGLTEXIMAGE3DPROC)load("glTexImage3D"); + glad_glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)load("glTexSubImage3D"); + glad_glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)load("glCopyTexSubImage3D"); +} +static void load_GL_VERSION_1_3(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_3) return; + glad_glActiveTexture = (PFNGLACTIVETEXTUREPROC)load("glActiveTexture"); + glad_glSampleCoverage = (PFNGLSAMPLECOVERAGEPROC)load("glSampleCoverage"); + glad_glCompressedTexImage3D = (PFNGLCOMPRESSEDTEXIMAGE3DPROC)load("glCompressedTexImage3D"); + glad_glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)load("glCompressedTexImage2D"); + glad_glCompressedTexImage1D = (PFNGLCOMPRESSEDTEXIMAGE1DPROC)load("glCompressedTexImage1D"); + glad_glCompressedTexSubImage3D = (PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC)load("glCompressedTexSubImage3D"); + glad_glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)load("glCompressedTexSubImage2D"); + glad_glCompressedTexSubImage1D = (PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC)load("glCompressedTexSubImage1D"); + glad_glGetCompressedTexImage = (PFNGLGETCOMPRESSEDTEXIMAGEPROC)load("glGetCompressedTexImage"); +} +static void load_GL_VERSION_1_4(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_4) return; + glad_glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)load("glBlendFuncSeparate"); + glad_glMultiDrawArrays = (PFNGLMULTIDRAWARRAYSPROC)load("glMultiDrawArrays"); + glad_glMultiDrawElements = (PFNGLMULTIDRAWELEMENTSPROC)load("glMultiDrawElements"); + glad_glPointParameterf = (PFNGLPOINTPARAMETERFPROC)load("glPointParameterf"); + glad_glPointParameterfv = (PFNGLPOINTPARAMETERFVPROC)load("glPointParameterfv"); + glad_glPointParameteri = (PFNGLPOINTPARAMETERIPROC)load("glPointParameteri"); + glad_glPointParameteriv = (PFNGLPOINTPARAMETERIVPROC)load("glPointParameteriv"); + glad_glBlendColor = (PFNGLBLENDCOLORPROC)load("glBlendColor"); + glad_glBlendEquation = (PFNGLBLENDEQUATIONPROC)load("glBlendEquation"); +} +static void load_GL_VERSION_1_5(GLADloadproc load) { + if(!GLAD_GL_VERSION_1_5) return; + glad_glGenQueries = (PFNGLGENQUERIESPROC)load("glGenQueries"); + glad_glDeleteQueries = (PFNGLDELETEQUERIESPROC)load("glDeleteQueries"); + glad_glIsQuery = (PFNGLISQUERYPROC)load("glIsQuery"); + glad_glBeginQuery = (PFNGLBEGINQUERYPROC)load("glBeginQuery"); + glad_glEndQuery = (PFNGLENDQUERYPROC)load("glEndQuery"); + glad_glGetQueryiv = (PFNGLGETQUERYIVPROC)load("glGetQueryiv"); + glad_glGetQueryObjectiv = (PFNGLGETQUERYOBJECTIVPROC)load("glGetQueryObjectiv"); + glad_glGetQueryObjectuiv = (PFNGLGETQUERYOBJECTUIVPROC)load("glGetQueryObjectuiv"); + glad_glBindBuffer = (PFNGLBINDBUFFERPROC)load("glBindBuffer"); + glad_glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)load("glDeleteBuffers"); + glad_glGenBuffers = (PFNGLGENBUFFERSPROC)load("glGenBuffers"); + glad_glIsBuffer = (PFNGLISBUFFERPROC)load("glIsBuffer"); + glad_glBufferData = (PFNGLBUFFERDATAPROC)load("glBufferData"); + glad_glBufferSubData = (PFNGLBUFFERSUBDATAPROC)load("glBufferSubData"); + glad_glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)load("glGetBufferSubData"); + glad_glMapBuffer = (PFNGLMAPBUFFERPROC)load("glMapBuffer"); + glad_glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)load("glUnmapBuffer"); + glad_glGetBufferParameteriv = (PFNGLGETBUFFERPARAMETERIVPROC)load("glGetBufferParameteriv"); + glad_glGetBufferPointerv = (PFNGLGETBUFFERPOINTERVPROC)load("glGetBufferPointerv"); +} +static void load_GL_VERSION_2_0(GLADloadproc load) { + if(!GLAD_GL_VERSION_2_0) return; + glad_glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)load("glBlendEquationSeparate"); + glad_glDrawBuffers = (PFNGLDRAWBUFFERSPROC)load("glDrawBuffers"); + glad_glStencilOpSeparate = (PFNGLSTENCILOPSEPARATEPROC)load("glStencilOpSeparate"); + glad_glStencilFuncSeparate = (PFNGLSTENCILFUNCSEPARATEPROC)load("glStencilFuncSeparate"); + glad_glStencilMaskSeparate = (PFNGLSTENCILMASKSEPARATEPROC)load("glStencilMaskSeparate"); + glad_glAttachShader = (PFNGLATTACHSHADERPROC)load("glAttachShader"); + glad_glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC)load("glBindAttribLocation"); + glad_glCompileShader = (PFNGLCOMPILESHADERPROC)load("glCompileShader"); + glad_glCreateProgram = (PFNGLCREATEPROGRAMPROC)load("glCreateProgram"); + glad_glCreateShader = (PFNGLCREATESHADERPROC)load("glCreateShader"); + glad_glDeleteProgram = (PFNGLDELETEPROGRAMPROC)load("glDeleteProgram"); + glad_glDeleteShader = (PFNGLDELETESHADERPROC)load("glDeleteShader"); + glad_glDetachShader = (PFNGLDETACHSHADERPROC)load("glDetachShader"); + glad_glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)load("glDisableVertexAttribArray"); + glad_glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)load("glEnableVertexAttribArray"); + glad_glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)load("glGetActiveAttrib"); + glad_glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)load("glGetActiveUniform"); + glad_glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)load("glGetAttachedShaders"); + glad_glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)load("glGetAttribLocation"); + glad_glGetProgramiv = (PFNGLGETPROGRAMIVPROC)load("glGetProgramiv"); + glad_glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)load("glGetProgramInfoLog"); + glad_glGetShaderiv = (PFNGLGETSHADERIVPROC)load("glGetShaderiv"); + glad_glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)load("glGetShaderInfoLog"); + glad_glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)load("glGetShaderSource"); + glad_glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)load("glGetUniformLocation"); + glad_glGetUniformfv = (PFNGLGETUNIFORMFVPROC)load("glGetUniformfv"); + glad_glGetUniformiv = (PFNGLGETUNIFORMIVPROC)load("glGetUniformiv"); + glad_glGetVertexAttribdv = (PFNGLGETVERTEXATTRIBDVPROC)load("glGetVertexAttribdv"); + glad_glGetVertexAttribfv = (PFNGLGETVERTEXATTRIBFVPROC)load("glGetVertexAttribfv"); + glad_glGetVertexAttribiv = (PFNGLGETVERTEXATTRIBIVPROC)load("glGetVertexAttribiv"); + glad_glGetVertexAttribPointerv = (PFNGLGETVERTEXATTRIBPOINTERVPROC)load("glGetVertexAttribPointerv"); + glad_glIsProgram = (PFNGLISPROGRAMPROC)load("glIsProgram"); + glad_glIsShader = (PFNGLISSHADERPROC)load("glIsShader"); + glad_glLinkProgram = (PFNGLLINKPROGRAMPROC)load("glLinkProgram"); + glad_glShaderSource = (PFNGLSHADERSOURCEPROC)load("glShaderSource"); + glad_glUseProgram = (PFNGLUSEPROGRAMPROC)load("glUseProgram"); + glad_glUniform1f = (PFNGLUNIFORM1FPROC)load("glUniform1f"); + glad_glUniform2f = (PFNGLUNIFORM2FPROC)load("glUniform2f"); + glad_glUniform3f = (PFNGLUNIFORM3FPROC)load("glUniform3f"); + glad_glUniform4f = (PFNGLUNIFORM4FPROC)load("glUniform4f"); + glad_glUniform1i = (PFNGLUNIFORM1IPROC)load("glUniform1i"); + glad_glUniform2i = (PFNGLUNIFORM2IPROC)load("glUniform2i"); + glad_glUniform3i = (PFNGLUNIFORM3IPROC)load("glUniform3i"); + glad_glUniform4i = (PFNGLUNIFORM4IPROC)load("glUniform4i"); + glad_glUniform1fv = (PFNGLUNIFORM1FVPROC)load("glUniform1fv"); + glad_glUniform2fv = (PFNGLUNIFORM2FVPROC)load("glUniform2fv"); + glad_glUniform3fv = (PFNGLUNIFORM3FVPROC)load("glUniform3fv"); + glad_glUniform4fv = (PFNGLUNIFORM4FVPROC)load("glUniform4fv"); + glad_glUniform1iv = (PFNGLUNIFORM1IVPROC)load("glUniform1iv"); + glad_glUniform2iv = (PFNGLUNIFORM2IVPROC)load("glUniform2iv"); + glad_glUniform3iv = (PFNGLUNIFORM3IVPROC)load("glUniform3iv"); + glad_glUniform4iv = (PFNGLUNIFORM4IVPROC)load("glUniform4iv"); + glad_glUniformMatrix2fv = (PFNGLUNIFORMMATRIX2FVPROC)load("glUniformMatrix2fv"); + glad_glUniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC)load("glUniformMatrix3fv"); + glad_glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)load("glUniformMatrix4fv"); + glad_glValidateProgram = (PFNGLVALIDATEPROGRAMPROC)load("glValidateProgram"); + glad_glVertexAttrib1d = (PFNGLVERTEXATTRIB1DPROC)load("glVertexAttrib1d"); + glad_glVertexAttrib1dv = (PFNGLVERTEXATTRIB1DVPROC)load("glVertexAttrib1dv"); + glad_glVertexAttrib1f = (PFNGLVERTEXATTRIB1FPROC)load("glVertexAttrib1f"); + glad_glVertexAttrib1fv = (PFNGLVERTEXATTRIB1FVPROC)load("glVertexAttrib1fv"); + glad_glVertexAttrib1s = (PFNGLVERTEXATTRIB1SPROC)load("glVertexAttrib1s"); + glad_glVertexAttrib1sv = (PFNGLVERTEXATTRIB1SVPROC)load("glVertexAttrib1sv"); + glad_glVertexAttrib2d = (PFNGLVERTEXATTRIB2DPROC)load("glVertexAttrib2d"); + glad_glVertexAttrib2dv = (PFNGLVERTEXATTRIB2DVPROC)load("glVertexAttrib2dv"); + glad_glVertexAttrib2f = (PFNGLVERTEXATTRIB2FPROC)load("glVertexAttrib2f"); + glad_glVertexAttrib2fv = (PFNGLVERTEXATTRIB2FVPROC)load("glVertexAttrib2fv"); + glad_glVertexAttrib2s = (PFNGLVERTEXATTRIB2SPROC)load("glVertexAttrib2s"); + glad_glVertexAttrib2sv = (PFNGLVERTEXATTRIB2SVPROC)load("glVertexAttrib2sv"); + glad_glVertexAttrib3d = (PFNGLVERTEXATTRIB3DPROC)load("glVertexAttrib3d"); + glad_glVertexAttrib3dv = (PFNGLVERTEXATTRIB3DVPROC)load("glVertexAttrib3dv"); + glad_glVertexAttrib3f = (PFNGLVERTEXATTRIB3FPROC)load("glVertexAttrib3f"); + glad_glVertexAttrib3fv = (PFNGLVERTEXATTRIB3FVPROC)load("glVertexAttrib3fv"); + glad_glVertexAttrib3s = (PFNGLVERTEXATTRIB3SPROC)load("glVertexAttrib3s"); + glad_glVertexAttrib3sv = (PFNGLVERTEXATTRIB3SVPROC)load("glVertexAttrib3sv"); + glad_glVertexAttrib4Nbv = (PFNGLVERTEXATTRIB4NBVPROC)load("glVertexAttrib4Nbv"); + glad_glVertexAttrib4Niv = (PFNGLVERTEXATTRIB4NIVPROC)load("glVertexAttrib4Niv"); + glad_glVertexAttrib4Nsv = (PFNGLVERTEXATTRIB4NSVPROC)load("glVertexAttrib4Nsv"); + glad_glVertexAttrib4Nub = (PFNGLVERTEXATTRIB4NUBPROC)load("glVertexAttrib4Nub"); + glad_glVertexAttrib4Nubv = (PFNGLVERTEXATTRIB4NUBVPROC)load("glVertexAttrib4Nubv"); + glad_glVertexAttrib4Nuiv = (PFNGLVERTEXATTRIB4NUIVPROC)load("glVertexAttrib4Nuiv"); + glad_glVertexAttrib4Nusv = (PFNGLVERTEXATTRIB4NUSVPROC)load("glVertexAttrib4Nusv"); + glad_glVertexAttrib4bv = (PFNGLVERTEXATTRIB4BVPROC)load("glVertexAttrib4bv"); + glad_glVertexAttrib4d = (PFNGLVERTEXATTRIB4DPROC)load("glVertexAttrib4d"); + glad_glVertexAttrib4dv = (PFNGLVERTEXATTRIB4DVPROC)load("glVertexAttrib4dv"); + glad_glVertexAttrib4f = (PFNGLVERTEXATTRIB4FPROC)load("glVertexAttrib4f"); + glad_glVertexAttrib4fv = (PFNGLVERTEXATTRIB4FVPROC)load("glVertexAttrib4fv"); + glad_glVertexAttrib4iv = (PFNGLVERTEXATTRIB4IVPROC)load("glVertexAttrib4iv"); + glad_glVertexAttrib4s = (PFNGLVERTEXATTRIB4SPROC)load("glVertexAttrib4s"); + glad_glVertexAttrib4sv = (PFNGLVERTEXATTRIB4SVPROC)load("glVertexAttrib4sv"); + glad_glVertexAttrib4ubv = (PFNGLVERTEXATTRIB4UBVPROC)load("glVertexAttrib4ubv"); + glad_glVertexAttrib4uiv = (PFNGLVERTEXATTRIB4UIVPROC)load("glVertexAttrib4uiv"); + glad_glVertexAttrib4usv = (PFNGLVERTEXATTRIB4USVPROC)load("glVertexAttrib4usv"); + glad_glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)load("glVertexAttribPointer"); +} +static void load_GL_VERSION_2_1(GLADloadproc load) { + if(!GLAD_GL_VERSION_2_1) return; + glad_glUniformMatrix2x3fv = (PFNGLUNIFORMMATRIX2X3FVPROC)load("glUniformMatrix2x3fv"); + glad_glUniformMatrix3x2fv = (PFNGLUNIFORMMATRIX3X2FVPROC)load("glUniformMatrix3x2fv"); + glad_glUniformMatrix2x4fv = (PFNGLUNIFORMMATRIX2X4FVPROC)load("glUniformMatrix2x4fv"); + glad_glUniformMatrix4x2fv = (PFNGLUNIFORMMATRIX4X2FVPROC)load("glUniformMatrix4x2fv"); + glad_glUniformMatrix3x4fv = (PFNGLUNIFORMMATRIX3X4FVPROC)load("glUniformMatrix3x4fv"); + glad_glUniformMatrix4x3fv = (PFNGLUNIFORMMATRIX4X3FVPROC)load("glUniformMatrix4x3fv"); +} +static void load_GL_VERSION_3_0(GLADloadproc load) { + if(!GLAD_GL_VERSION_3_0) return; + glad_glColorMaski = (PFNGLCOLORMASKIPROC)load("glColorMaski"); + glad_glGetBooleani_v = (PFNGLGETBOOLEANI_VPROC)load("glGetBooleani_v"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); + glad_glEnablei = (PFNGLENABLEIPROC)load("glEnablei"); + glad_glDisablei = (PFNGLDISABLEIPROC)load("glDisablei"); + glad_glIsEnabledi = (PFNGLISENABLEDIPROC)load("glIsEnabledi"); + glad_glBeginTransformFeedback = (PFNGLBEGINTRANSFORMFEEDBACKPROC)load("glBeginTransformFeedback"); + glad_glEndTransformFeedback = (PFNGLENDTRANSFORMFEEDBACKPROC)load("glEndTransformFeedback"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); + glad_glTransformFeedbackVaryings = (PFNGLTRANSFORMFEEDBACKVARYINGSPROC)load("glTransformFeedbackVaryings"); + glad_glGetTransformFeedbackVarying = (PFNGLGETTRANSFORMFEEDBACKVARYINGPROC)load("glGetTransformFeedbackVarying"); + glad_glClampColor = (PFNGLCLAMPCOLORPROC)load("glClampColor"); + glad_glBeginConditionalRender = (PFNGLBEGINCONDITIONALRENDERPROC)load("glBeginConditionalRender"); + glad_glEndConditionalRender = (PFNGLENDCONDITIONALRENDERPROC)load("glEndConditionalRender"); + glad_glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)load("glVertexAttribIPointer"); + glad_glGetVertexAttribIiv = (PFNGLGETVERTEXATTRIBIIVPROC)load("glGetVertexAttribIiv"); + glad_glGetVertexAttribIuiv = (PFNGLGETVERTEXATTRIBIUIVPROC)load("glGetVertexAttribIuiv"); + glad_glVertexAttribI1i = (PFNGLVERTEXATTRIBI1IPROC)load("glVertexAttribI1i"); + glad_glVertexAttribI2i = (PFNGLVERTEXATTRIBI2IPROC)load("glVertexAttribI2i"); + glad_glVertexAttribI3i = (PFNGLVERTEXATTRIBI3IPROC)load("glVertexAttribI3i"); + glad_glVertexAttribI4i = (PFNGLVERTEXATTRIBI4IPROC)load("glVertexAttribI4i"); + glad_glVertexAttribI1ui = (PFNGLVERTEXATTRIBI1UIPROC)load("glVertexAttribI1ui"); + glad_glVertexAttribI2ui = (PFNGLVERTEXATTRIBI2UIPROC)load("glVertexAttribI2ui"); + glad_glVertexAttribI3ui = (PFNGLVERTEXATTRIBI3UIPROC)load("glVertexAttribI3ui"); + glad_glVertexAttribI4ui = (PFNGLVERTEXATTRIBI4UIPROC)load("glVertexAttribI4ui"); + glad_glVertexAttribI1iv = (PFNGLVERTEXATTRIBI1IVPROC)load("glVertexAttribI1iv"); + glad_glVertexAttribI2iv = (PFNGLVERTEXATTRIBI2IVPROC)load("glVertexAttribI2iv"); + glad_glVertexAttribI3iv = (PFNGLVERTEXATTRIBI3IVPROC)load("glVertexAttribI3iv"); + glad_glVertexAttribI4iv = (PFNGLVERTEXATTRIBI4IVPROC)load("glVertexAttribI4iv"); + glad_glVertexAttribI1uiv = (PFNGLVERTEXATTRIBI1UIVPROC)load("glVertexAttribI1uiv"); + glad_glVertexAttribI2uiv = (PFNGLVERTEXATTRIBI2UIVPROC)load("glVertexAttribI2uiv"); + glad_glVertexAttribI3uiv = (PFNGLVERTEXATTRIBI3UIVPROC)load("glVertexAttribI3uiv"); + glad_glVertexAttribI4uiv = (PFNGLVERTEXATTRIBI4UIVPROC)load("glVertexAttribI4uiv"); + glad_glVertexAttribI4bv = (PFNGLVERTEXATTRIBI4BVPROC)load("glVertexAttribI4bv"); + glad_glVertexAttribI4sv = (PFNGLVERTEXATTRIBI4SVPROC)load("glVertexAttribI4sv"); + glad_glVertexAttribI4ubv = (PFNGLVERTEXATTRIBI4UBVPROC)load("glVertexAttribI4ubv"); + glad_glVertexAttribI4usv = (PFNGLVERTEXATTRIBI4USVPROC)load("glVertexAttribI4usv"); + glad_glGetUniformuiv = (PFNGLGETUNIFORMUIVPROC)load("glGetUniformuiv"); + glad_glBindFragDataLocation = (PFNGLBINDFRAGDATALOCATIONPROC)load("glBindFragDataLocation"); + glad_glGetFragDataLocation = (PFNGLGETFRAGDATALOCATIONPROC)load("glGetFragDataLocation"); + glad_glUniform1ui = (PFNGLUNIFORM1UIPROC)load("glUniform1ui"); + glad_glUniform2ui = (PFNGLUNIFORM2UIPROC)load("glUniform2ui"); + glad_glUniform3ui = (PFNGLUNIFORM3UIPROC)load("glUniform3ui"); + glad_glUniform4ui = (PFNGLUNIFORM4UIPROC)load("glUniform4ui"); + glad_glUniform1uiv = (PFNGLUNIFORM1UIVPROC)load("glUniform1uiv"); + glad_glUniform2uiv = (PFNGLUNIFORM2UIVPROC)load("glUniform2uiv"); + glad_glUniform3uiv = (PFNGLUNIFORM3UIVPROC)load("glUniform3uiv"); + glad_glUniform4uiv = (PFNGLUNIFORM4UIVPROC)load("glUniform4uiv"); + glad_glTexParameterIiv = (PFNGLTEXPARAMETERIIVPROC)load("glTexParameterIiv"); + glad_glTexParameterIuiv = (PFNGLTEXPARAMETERIUIVPROC)load("glTexParameterIuiv"); + glad_glGetTexParameterIiv = (PFNGLGETTEXPARAMETERIIVPROC)load("glGetTexParameterIiv"); + glad_glGetTexParameterIuiv = (PFNGLGETTEXPARAMETERIUIVPROC)load("glGetTexParameterIuiv"); + glad_glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)load("glClearBufferiv"); + glad_glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)load("glClearBufferuiv"); + glad_glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)load("glClearBufferfv"); + glad_glClearBufferfi = (PFNGLCLEARBUFFERFIPROC)load("glClearBufferfi"); + glad_glGetStringi = (PFNGLGETSTRINGIPROC)load("glGetStringi"); + glad_glIsRenderbuffer = (PFNGLISRENDERBUFFERPROC)load("glIsRenderbuffer"); + glad_glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)load("glBindRenderbuffer"); + glad_glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)load("glDeleteRenderbuffers"); + glad_glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)load("glGenRenderbuffers"); + glad_glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)load("glRenderbufferStorage"); + glad_glGetRenderbufferParameteriv = (PFNGLGETRENDERBUFFERPARAMETERIVPROC)load("glGetRenderbufferParameteriv"); + glad_glIsFramebuffer = (PFNGLISFRAMEBUFFERPROC)load("glIsFramebuffer"); + glad_glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)load("glBindFramebuffer"); + glad_glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)load("glDeleteFramebuffers"); + glad_glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)load("glGenFramebuffers"); + glad_glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)load("glCheckFramebufferStatus"); + glad_glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)load("glFramebufferTexture1D"); + glad_glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)load("glFramebufferTexture2D"); + glad_glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)load("glFramebufferTexture3D"); + glad_glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)load("glFramebufferRenderbuffer"); + glad_glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)load("glGetFramebufferAttachmentParameteriv"); + glad_glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)load("glGenerateMipmap"); + glad_glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)load("glBlitFramebuffer"); + glad_glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)load("glRenderbufferStorageMultisample"); + glad_glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)load("glFramebufferTextureLayer"); + glad_glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)load("glMapBufferRange"); + glad_glFlushMappedBufferRange = (PFNGLFLUSHMAPPEDBUFFERRANGEPROC)load("glFlushMappedBufferRange"); + glad_glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)load("glBindVertexArray"); + glad_glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)load("glDeleteVertexArrays"); + glad_glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)load("glGenVertexArrays"); + glad_glIsVertexArray = (PFNGLISVERTEXARRAYPROC)load("glIsVertexArray"); +} +static void load_GL_VERSION_3_1(GLADloadproc load) { + if(!GLAD_GL_VERSION_3_1) return; + glad_glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)load("glDrawArraysInstanced"); + glad_glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)load("glDrawElementsInstanced"); + glad_glTexBuffer = (PFNGLTEXBUFFERPROC)load("glTexBuffer"); + glad_glPrimitiveRestartIndex = (PFNGLPRIMITIVERESTARTINDEXPROC)load("glPrimitiveRestartIndex"); + glad_glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)load("glCopyBufferSubData"); + glad_glGetUniformIndices = (PFNGLGETUNIFORMINDICESPROC)load("glGetUniformIndices"); + glad_glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)load("glGetActiveUniformsiv"); + glad_glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)load("glGetActiveUniformName"); + glad_glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)load("glGetUniformBlockIndex"); + glad_glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)load("glGetActiveUniformBlockiv"); + glad_glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)load("glGetActiveUniformBlockName"); + glad_glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)load("glUniformBlockBinding"); + glad_glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)load("glBindBufferRange"); + glad_glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)load("glBindBufferBase"); + glad_glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)load("glGetIntegeri_v"); +} +static void load_GL_VERSION_3_2(GLADloadproc load) { + if(!GLAD_GL_VERSION_3_2) return; + glad_glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)load("glDrawElementsBaseVertex"); + glad_glDrawRangeElementsBaseVertex = (PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC)load("glDrawRangeElementsBaseVertex"); + glad_glDrawElementsInstancedBaseVertex = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC)load("glDrawElementsInstancedBaseVertex"); + glad_glMultiDrawElementsBaseVertex = (PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC)load("glMultiDrawElementsBaseVertex"); + glad_glProvokingVertex = (PFNGLPROVOKINGVERTEXPROC)load("glProvokingVertex"); + glad_glFenceSync = (PFNGLFENCESYNCPROC)load("glFenceSync"); + glad_glIsSync = (PFNGLISSYNCPROC)load("glIsSync"); + glad_glDeleteSync = (PFNGLDELETESYNCPROC)load("glDeleteSync"); + glad_glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)load("glClientWaitSync"); + glad_glWaitSync = (PFNGLWAITSYNCPROC)load("glWaitSync"); + glad_glGetInteger64v = (PFNGLGETINTEGER64VPROC)load("glGetInteger64v"); + glad_glGetSynciv = (PFNGLGETSYNCIVPROC)load("glGetSynciv"); + glad_glGetInteger64i_v = (PFNGLGETINTEGER64I_VPROC)load("glGetInteger64i_v"); + glad_glGetBufferParameteri64v = (PFNGLGETBUFFERPARAMETERI64VPROC)load("glGetBufferParameteri64v"); + glad_glFramebufferTexture = (PFNGLFRAMEBUFFERTEXTUREPROC)load("glFramebufferTexture"); + glad_glTexImage2DMultisample = (PFNGLTEXIMAGE2DMULTISAMPLEPROC)load("glTexImage2DMultisample"); + glad_glTexImage3DMultisample = (PFNGLTEXIMAGE3DMULTISAMPLEPROC)load("glTexImage3DMultisample"); + glad_glGetMultisamplefv = (PFNGLGETMULTISAMPLEFVPROC)load("glGetMultisamplefv"); + glad_glSampleMaski = (PFNGLSAMPLEMASKIPROC)load("glSampleMaski"); +} +static void load_GL_VERSION_3_3(GLADloadproc load) { + if(!GLAD_GL_VERSION_3_3) return; + glad_glBindFragDataLocationIndexed = (PFNGLBINDFRAGDATALOCATIONINDEXEDPROC)load("glBindFragDataLocationIndexed"); + glad_glGetFragDataIndex = (PFNGLGETFRAGDATAINDEXPROC)load("glGetFragDataIndex"); + glad_glGenSamplers = (PFNGLGENSAMPLERSPROC)load("glGenSamplers"); + glad_glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)load("glDeleteSamplers"); + glad_glIsSampler = (PFNGLISSAMPLERPROC)load("glIsSampler"); + glad_glBindSampler = (PFNGLBINDSAMPLERPROC)load("glBindSampler"); + glad_glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)load("glSamplerParameteri"); + glad_glSamplerParameteriv = (PFNGLSAMPLERPARAMETERIVPROC)load("glSamplerParameteriv"); + glad_glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)load("glSamplerParameterf"); + glad_glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)load("glSamplerParameterfv"); + glad_glSamplerParameterIiv = (PFNGLSAMPLERPARAMETERIIVPROC)load("glSamplerParameterIiv"); + glad_glSamplerParameterIuiv = (PFNGLSAMPLERPARAMETERIUIVPROC)load("glSamplerParameterIuiv"); + glad_glGetSamplerParameteriv = (PFNGLGETSAMPLERPARAMETERIVPROC)load("glGetSamplerParameteriv"); + glad_glGetSamplerParameterIiv = (PFNGLGETSAMPLERPARAMETERIIVPROC)load("glGetSamplerParameterIiv"); + glad_glGetSamplerParameterfv = (PFNGLGETSAMPLERPARAMETERFVPROC)load("glGetSamplerParameterfv"); + glad_glGetSamplerParameterIuiv = (PFNGLGETSAMPLERPARAMETERIUIVPROC)load("glGetSamplerParameterIuiv"); + glad_glQueryCounter = (PFNGLQUERYCOUNTERPROC)load("glQueryCounter"); + glad_glGetQueryObjecti64v = (PFNGLGETQUERYOBJECTI64VPROC)load("glGetQueryObjecti64v"); + glad_glGetQueryObjectui64v = (PFNGLGETQUERYOBJECTUI64VPROC)load("glGetQueryObjectui64v"); + glad_glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)load("glVertexAttribDivisor"); + glad_glVertexAttribP1ui = (PFNGLVERTEXATTRIBP1UIPROC)load("glVertexAttribP1ui"); + glad_glVertexAttribP1uiv = (PFNGLVERTEXATTRIBP1UIVPROC)load("glVertexAttribP1uiv"); + glad_glVertexAttribP2ui = (PFNGLVERTEXATTRIBP2UIPROC)load("glVertexAttribP2ui"); + glad_glVertexAttribP2uiv = (PFNGLVERTEXATTRIBP2UIVPROC)load("glVertexAttribP2uiv"); + glad_glVertexAttribP3ui = (PFNGLVERTEXATTRIBP3UIPROC)load("glVertexAttribP3ui"); + glad_glVertexAttribP3uiv = (PFNGLVERTEXATTRIBP3UIVPROC)load("glVertexAttribP3uiv"); + glad_glVertexAttribP4ui = (PFNGLVERTEXATTRIBP4UIPROC)load("glVertexAttribP4ui"); + glad_glVertexAttribP4uiv = (PFNGLVERTEXATTRIBP4UIVPROC)load("glVertexAttribP4uiv"); + glad_glVertexP2ui = (PFNGLVERTEXP2UIPROC)load("glVertexP2ui"); + glad_glVertexP2uiv = (PFNGLVERTEXP2UIVPROC)load("glVertexP2uiv"); + glad_glVertexP3ui = (PFNGLVERTEXP3UIPROC)load("glVertexP3ui"); + glad_glVertexP3uiv = (PFNGLVERTEXP3UIVPROC)load("glVertexP3uiv"); + glad_glVertexP4ui = (PFNGLVERTEXP4UIPROC)load("glVertexP4ui"); + glad_glVertexP4uiv = (PFNGLVERTEXP4UIVPROC)load("glVertexP4uiv"); + glad_glTexCoordP1ui = (PFNGLTEXCOORDP1UIPROC)load("glTexCoordP1ui"); + glad_glTexCoordP1uiv = (PFNGLTEXCOORDP1UIVPROC)load("glTexCoordP1uiv"); + glad_glTexCoordP2ui = (PFNGLTEXCOORDP2UIPROC)load("glTexCoordP2ui"); + glad_glTexCoordP2uiv = (PFNGLTEXCOORDP2UIVPROC)load("glTexCoordP2uiv"); + glad_glTexCoordP3ui = (PFNGLTEXCOORDP3UIPROC)load("glTexCoordP3ui"); + glad_glTexCoordP3uiv = (PFNGLTEXCOORDP3UIVPROC)load("glTexCoordP3uiv"); + glad_glTexCoordP4ui = (PFNGLTEXCOORDP4UIPROC)load("glTexCoordP4ui"); + glad_glTexCoordP4uiv = (PFNGLTEXCOORDP4UIVPROC)load("glTexCoordP4uiv"); + glad_glMultiTexCoordP1ui = (PFNGLMULTITEXCOORDP1UIPROC)load("glMultiTexCoordP1ui"); + glad_glMultiTexCoordP1uiv = (PFNGLMULTITEXCOORDP1UIVPROC)load("glMultiTexCoordP1uiv"); + glad_glMultiTexCoordP2ui = (PFNGLMULTITEXCOORDP2UIPROC)load("glMultiTexCoordP2ui"); + glad_glMultiTexCoordP2uiv = (PFNGLMULTITEXCOORDP2UIVPROC)load("glMultiTexCoordP2uiv"); + glad_glMultiTexCoordP3ui = (PFNGLMULTITEXCOORDP3UIPROC)load("glMultiTexCoordP3ui"); + glad_glMultiTexCoordP3uiv = (PFNGLMULTITEXCOORDP3UIVPROC)load("glMultiTexCoordP3uiv"); + glad_glMultiTexCoordP4ui = (PFNGLMULTITEXCOORDP4UIPROC)load("glMultiTexCoordP4ui"); + glad_glMultiTexCoordP4uiv = (PFNGLMULTITEXCOORDP4UIVPROC)load("glMultiTexCoordP4uiv"); + glad_glNormalP3ui = (PFNGLNORMALP3UIPROC)load("glNormalP3ui"); + glad_glNormalP3uiv = (PFNGLNORMALP3UIVPROC)load("glNormalP3uiv"); + glad_glColorP3ui = (PFNGLCOLORP3UIPROC)load("glColorP3ui"); + glad_glColorP3uiv = (PFNGLCOLORP3UIVPROC)load("glColorP3uiv"); + glad_glColorP4ui = (PFNGLCOLORP4UIPROC)load("glColorP4ui"); + glad_glColorP4uiv = (PFNGLCOLORP4UIVPROC)load("glColorP4uiv"); + glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui"); + glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv"); +} +static int find_extensionsGL(void) { + if (!get_exts()) return 0; + (void)&has_ext; + free_exts(); + return 1; +} + +static void find_coreGL(void) { + + /* Thank you @elmindreda + * https://github.com/elmindreda/greg/blob/master/templates/greg.c.in#L176 + * https://github.com/glfw/glfw/blob/master/src/context.c#L36 + */ + int i, major, minor; + + const char* version; + const char* prefixes[] = { + "OpenGL ES-CM ", + "OpenGL ES-CL ", + "OpenGL ES ", + NULL + }; + + version = (const char*) glGetString(GL_VERSION); + if (!version) return; + + for (i = 0; prefixes[i]; i++) { + const size_t length = strlen(prefixes[i]); + if (strncmp(version, prefixes[i], length) == 0) { + version += length; + break; + } + } + +/* PR #18 */ +#ifdef _MSC_VER + sscanf_s(version, "%d.%d", &major, &minor); +#else + sscanf(version, "%d.%d", &major, &minor); +#endif + + GLVersion.major = major; GLVersion.minor = minor; + max_loaded_major = major; max_loaded_minor = minor; + GLAD_GL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GL_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GL_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GL_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GL_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + GLAD_GL_VERSION_1_5 = (major == 1 && minor >= 5) || major > 1; + GLAD_GL_VERSION_2_0 = (major == 2 && minor >= 0) || major > 2; + GLAD_GL_VERSION_2_1 = (major == 2 && minor >= 1) || major > 2; + GLAD_GL_VERSION_3_0 = (major == 3 && minor >= 0) || major > 3; + GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; + GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; + GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; + if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 3)) { + max_loaded_major = 3; + max_loaded_minor = 3; + } +} + +int gladLoadGLLoader(GLADloadproc load) { + GLVersion.major = 0; GLVersion.minor = 0; + glGetString = (PFNGLGETSTRINGPROC)load("glGetString"); + if(glGetString == NULL) return 0; + if(glGetString(GL_VERSION) == NULL) return 0; + find_coreGL(); + load_GL_VERSION_1_0(load); + load_GL_VERSION_1_1(load); + load_GL_VERSION_1_2(load); + load_GL_VERSION_1_3(load); + load_GL_VERSION_1_4(load); + load_GL_VERSION_1_5(load); + load_GL_VERSION_2_0(load); + load_GL_VERSION_2_1(load); + load_GL_VERSION_3_0(load); + load_GL_VERSION_3_1(load); + load_GL_VERSION_3_2(load); + load_GL_VERSION_3_3(load); + + if (!find_extensionsGL()) return 0; + return GLVersion.major != 0 || GLVersion.minor != 0; +} + diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..cd3794e --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,157 @@ +#include // Must be included before GLFW +#include +#include + +// Window dimensions +const unsigned int SCR_WIDTH = 800; +const unsigned int SCR_HEIGHT = 600; + +// Shaders (in GLSL - OpenGL Shading Language) +// Vertex Shader: Positions the vertices +const char *vertexShaderSource = R"glsl( + #version 330 core + layout (location = 0) in vec3 aPos; + void main() + { + gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); + } +)glsl"; + +// Fragment Shader: Colors the pixels (fragments) +const char *fragmentShaderSource = R"glsl( + #version 330 core + out vec4 FragColor; + void main() + { + FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); // An orange color + } +)glsl"; + +// Callback function for when the window is resized +void framebuffer_size_callback(GLFWwindow* window, int width, int height) { + glViewport(0, 0, width, height); +} + +int main() { + // 1. --- Initialize GLFW --- + if (!glfwInit()) { + std::cerr << "Failed to initialize GLFW" << std::endl; + return -1; + } + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); +#ifdef __APPLE__ + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // For macOS +#endif + + // 2. --- Create a Window --- + GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "HelloTriangle", NULL, NULL); + if (window == NULL) { + std::cerr << "Failed to create GLFW window" << std::endl; + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + // 3. --- Initialize GLAD --- + if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { + std::cerr << "Failed to initialize GLAD" << std::endl; + return -1; + } + + // 4. --- Compile Shaders --- + + // Vertex Shader + unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); + glCompileShader(vertexShader); + // Check for compilation errors + int success; + char infoLog[512]; + glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); + std::cerr << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; + } + + // Fragment Shader + unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); + glCompileShader(fragmentShader); + // Check for compilation errors + glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); + std::cerr << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; + } + + // Link shaders into a Shader Program + unsigned int shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + // Check for linking errors + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); + std::cerr << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; + } + glDeleteShader(vertexShader); // Shaders are linked, we can delete them + glDeleteShader(fragmentShader); + + // 5. --- Set up Vertex Data and Buffers --- + // A triangle has 3 vertices, each with 3 coordinates (x, y, z) + float vertices[] = { + -0.5f, -0.5f, 0.0f, // left + 0.5f, -0.5f, 0.0f, // right + 0.0f, 0.5f, 0.0f // top + }; + + unsigned int VBO, VAO; + glGenVertexArrays(1, &VAO); // 1. Create Vertex Array Object (VAO) + glGenBuffers(1, &VBO); // 2. Create Vertex Buffer Object (VBO) + + glBindVertexArray(VAO); // 3. Bind the VAO + + glBindBuffer(GL_ARRAY_BUFFER, VBO); // 4. Bind the VBO + // 5. Copy vertex data into VBO's memory + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + // 6. Tell OpenGL how to interpret the vertex data + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); // Enable the vertex attribute (location 0) + + // Unbind VBO and VAO (optional, but good practice) + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + // 6. --- The Render Loop --- + while (!glfwWindowShouldClose(window)) { + // Input (e.g., close window on ESC) + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); + + // Rendering + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // Set background color + glClear(GL_COLOR_BUFFER_BIT); + + // Draw the triangle + glUseProgram(shaderProgram); // Use our shader program + glBindVertexArray(VAO); // Bind the VAO (our triangle's "recipe") + glDrawArrays(GL_TRIANGLES, 0, 3); // Draw it! + + // Swap buffers and poll for events + glfwSwapBuffers(window); + glfwPollEvents(); + } + + // 7. --- Cleanup --- + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &VBO); + glDeleteProgram(shaderProgram); + + glfwTerminate(); // Clean up GLFW + return 0; +} \ No newline at end of file diff --git a/vendor/LICENSE.md b/vendor/LICENSE.md new file mode 100644 index 0000000..7494a3f --- /dev/null +++ b/vendor/LICENSE.md @@ -0,0 +1,23 @@ +Copyright (c) 2002-2006 Marcus Geelnard + +Copyright (c) 2006-2019 Camilla Löwy + +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. + diff --git a/vendor/README.md b/vendor/README.md new file mode 100644 index 0000000..cf305f9 --- /dev/null +++ b/vendor/README.md @@ -0,0 +1,70 @@ +# GLFW binaries for 64-bit Windows + +This archive contains documentation, headers, pre-compiled static libraries, +import libraries and DLLs for GLFW 3.4. + +Binaries for the following compilers are included + + - Visual C++ 2022 (built with 17.9.0) + - Visual C++ 2019 (built with 16.11.34) + - Visual C++ 2017 (built with 15.9.60) + - Visual C++ 2015 (built with 14.0.25431.01) + - Visual C++ 2013 (built with 12.0.40629.00) + - MinGW-w64 (built with 13.2.0-win32-dwarf-msvcrt) + + +## Binaries for Visual C++ + +All binaries for Visual C++ 2017 and earlier are compatible with Windows XP, but +this is not supported by Visual C++ 2019. This support has been deprecated by +Microsoft and GLFW will also drop support for Windows XP in a future release. + +### GLFW as a DLL + +To use GLFW as a DLL, link against the `glfw3dll.lib` file for your +environment. This will add a load time dependency on `glfw3.dll`. The +remaining files in the same directory are not needed. + +This DLL is built in release mode for the Multithreaded DLL runtime library. + +There is also a GLFW DLL and import library pair in the `lib-static-ucrt` +directory. These are built with Visual C++ 2019 and the static Multithreaded +runtime library. + +### GLFW as a static library + +To use GLFW as a static library, link against `glfw3.lib` if your application +is using the Multithreaded DLL runtime library, or `glfw3_mt.lib` if it is +using the static Multithreaded runtime library. The remaining files in the same +directory are not needed. + +The static libraries are built in release mode and do not contain debug +information but can still be linked with the debug versions of the runtime +library. + + +## Binaries for MinGW-w64 + +### GLFW as a DLL + +To use GLFW as a DLL, link against the `libglfw3dll.a` file for your +environment. This will add a load time dependency on `glfw3.dll`. The +remaining files in the same directory are not needed. + +The DLLs are built in release mode. + +The DLLs depend on the `msvcrt.dll` C runtime library. There is also a GLFW +DLL and import library in the `lib-static-ucrt` directory that is built with +Visual C++ 2019 and statically linked against the UCRT. + +All DLLs in this archive provide the same ABI and can be used as drop-in +replacements for one another, as long as the C runtime library they depend on is +available. + +### GLFW as a static library + +To use GLFW as a static library, link against the `libglfw3.a` file for your +environment. The other files in the same directory are not needed. + +The library is built in release mode and do not contain debug information. + diff --git a/vendor/include/GLFW/glfw3.h b/vendor/include/GLFW/glfw3.h new file mode 100644 index 0000000..9c55ac9 --- /dev/null +++ b/vendor/include/GLFW/glfw3.h @@ -0,0 +1,6547 @@ +/************************************************************************* + * GLFW 3.4 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2019 Camilla Löwy + * + * 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 + *************************************************************************/ + +/*! @file glfw3.h + * @brief The header of the GLFW 3 API. + * + * This is the header file of the GLFW 3 API. It defines all its types and + * declares all its functions. + * + * For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * @brief Functions and types related to OpenGL and OpenGL ES contexts. + * + * This is the reference documentation for OpenGL and OpenGL ES context related + * functions. For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan support reference + * @brief Functions and types related to Vulkan. + * + * This is the reference documentation for Vulkan related functions and types. + * For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * @brief Functions and types related to initialization and error handling. + * + * This is the reference documentation for initialization and termination of + * the library, version management and error handling. For more task-oriented + * information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * @brief Functions and types related to input handling. + * + * This is the reference documentation for input related functions and types. + * For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * @brief Functions and types related to monitors. + * + * This is the reference documentation for monitor related functions and types. + * For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * @brief Functions and types related to windows. + * + * This is the reference documentation for window related functions and types, + * including creation, deletion and event polling. For more task-oriented + * information, see the @ref window_guide. + */ + + +/************************************************************************* + * 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 */ + +/* Include because most Windows GLU headers need wchar_t and + * the macOS OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +/* Include because it is needed by Vulkan and related functions. + * Include it unconditionally to avoid surprising side-effects. + */ +#include + +#if defined(GLFW_INCLUDE_VULKAN) + #include +#endif /* Vulkan header */ + +/* The Vulkan header may have indirectly included windows.h (because of + * VK_USE_PLATFORM_WIN32_KHR) so we offer our replacement symbols after it. + */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#if !defined(APIENTRY) + #if defined(_WIN32) + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif + #define GLFW_APIENTRY_DEFINED +#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 */ + +/* Include the chosen OpenGL or OpenGL ES headers. + */ +#if 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_ES32) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + +#elif defined(GLFW_INCLUDE_GLCOREARB) + + #if defined(__APPLE__) + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif /*GLFW_INCLUDE_GLEXT*/ + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#elif defined(GLFW_INCLUDE_GLU) + + #if defined(__APPLE__) + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #else /*__APPLE__*/ + + #if defined(GLFW_INCLUDE_GLU) + #include + #endif + + #endif /*__APPLE__*/ + +#elif !defined(GLFW_INCLUDE_NONE) && \ + !defined(__gl_h_) && \ + !defined(__gles1_gl_h_) && \ + !defined(__gles2_gl2_h_) && \ + !defined(__gles2_gl3_h_) && \ + !defined(__gles2_gl31_h_) && \ + !defined(__gles2_gl32_h_) && \ + !defined(__gl_glcorearb_h_) && \ + !defined(__gl2_h_) /*legacy*/ && \ + !defined(__gl3_h_) /*legacy*/ && \ + !defined(__gl31_h_) /*legacy*/ && \ + !defined(__gl32_h_) /*legacy*/ && \ + !defined(__glcorearb_h_) /*legacy*/ && \ + !defined(__GL_H__) /*non-standard*/ && \ + !defined(__gltypes_h_) /*non-standard*/ && \ + !defined(__glee_h_) /*non-standard*/ + + #if defined(__APPLE__) + + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + + #else /*__APPLE__*/ + + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + + #endif /*__APPLE__*/ + +#endif /* OpenGL and OpenGL ES headers */ + +#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 must 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 a GLFW Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Unix shared library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW header. + * + * The major version number of the GLFW header. 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 header. + * + * The minor version number of the GLFW header. This is incremented when + * features are added to the API but it remains backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 4 +/*! @brief The revision number of the GLFW header. + * + * The revision number of the GLFW header. This is incremented when a bug fix + * release is made that does not contain any API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 0 +/*! @} */ + +/*! @brief One. + * + * This is only semantic sugar for the number 1. You can instead use `1` or + * `true` or `_True` or `GL_TRUE` or `VK_TRUE` or anything else that is equal + * to one. + * + * @ingroup init + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * This is only semantic sugar for the number 0. You can instead use `0` or + * `false` or `_False` or `GL_FALSE` or `VK_FALSE` or anything else that is + * equal to zero. + * + * @ingroup init + */ +#define GLFW_FALSE 0 + +/*! @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 hat_state Joystick hat states + * @brief Joystick hat states. + * + * See [joystick hat input](@ref joystick_hat) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_HAT_CENTERED 0 +#define GLFW_HAT_UP 1 +#define GLFW_HAT_RIGHT 2 +#define GLFW_HAT_DOWN 4 +#define GLFW_HAT_LEFT 8 +#define GLFW_HAT_RIGHT_UP (GLFW_HAT_RIGHT | GLFW_HAT_UP) +#define GLFW_HAT_RIGHT_DOWN (GLFW_HAT_RIGHT | GLFW_HAT_DOWN) +#define GLFW_HAT_LEFT_UP (GLFW_HAT_LEFT | GLFW_HAT_UP) +#define GLFW_HAT_LEFT_DOWN (GLFW_HAT_LEFT | GLFW_HAT_DOWN) + +/*! @ingroup input + */ +#define GLFW_KEY_UNKNOWN -1 + +/*! @} */ + +/*! @defgroup keys Keyboard key tokens + * @brief Keyboard key tokens. + * + * 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 alphanumeric 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 + * @{ + */ + +/* 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 + * @brief 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. + * + * 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. + * + * 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. + * + * 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. + * + * If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 +/*! @brief If this bit is set the Caps Lock key is enabled. + * + * If this bit is set the Caps Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_CAPS_LOCK 0x0010 +/*! @brief If this bit is set the Num Lock key is enabled. + * + * If this bit is set the Num Lock key is enabled and the @ref + * GLFW_LOCK_KEY_MODS input mode is set. + */ +#define GLFW_MOD_NUM_LOCK 0x0020 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * @brief Mouse button IDs. + * + * 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 + * @brief Joystick IDs. + * + * 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 gamepad_buttons Gamepad buttons + * @brief Gamepad buttons. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_BUTTON_A 0 +#define GLFW_GAMEPAD_BUTTON_B 1 +#define GLFW_GAMEPAD_BUTTON_X 2 +#define GLFW_GAMEPAD_BUTTON_Y 3 +#define GLFW_GAMEPAD_BUTTON_LEFT_BUMPER 4 +#define GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER 5 +#define GLFW_GAMEPAD_BUTTON_BACK 6 +#define GLFW_GAMEPAD_BUTTON_START 7 +#define GLFW_GAMEPAD_BUTTON_GUIDE 8 +#define GLFW_GAMEPAD_BUTTON_LEFT_THUMB 9 +#define GLFW_GAMEPAD_BUTTON_RIGHT_THUMB 10 +#define GLFW_GAMEPAD_BUTTON_DPAD_UP 11 +#define GLFW_GAMEPAD_BUTTON_DPAD_RIGHT 12 +#define GLFW_GAMEPAD_BUTTON_DPAD_DOWN 13 +#define GLFW_GAMEPAD_BUTTON_DPAD_LEFT 14 +#define GLFW_GAMEPAD_BUTTON_LAST GLFW_GAMEPAD_BUTTON_DPAD_LEFT + +#define GLFW_GAMEPAD_BUTTON_CROSS GLFW_GAMEPAD_BUTTON_A +#define GLFW_GAMEPAD_BUTTON_CIRCLE GLFW_GAMEPAD_BUTTON_B +#define GLFW_GAMEPAD_BUTTON_SQUARE GLFW_GAMEPAD_BUTTON_X +#define GLFW_GAMEPAD_BUTTON_TRIANGLE GLFW_GAMEPAD_BUTTON_Y +/*! @} */ + +/*! @defgroup gamepad_axes Gamepad axes + * @brief Gamepad axes. + * + * See @ref gamepad for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_GAMEPAD_AXIS_LEFT_X 0 +#define GLFW_GAMEPAD_AXIS_LEFT_Y 1 +#define GLFW_GAMEPAD_AXIS_RIGHT_X 2 +#define GLFW_GAMEPAD_AXIS_RIGHT_Y 3 +#define GLFW_GAMEPAD_AXIS_LEFT_TRIGGER 4 +#define GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER 5 +#define GLFW_GAMEPAD_AXIS_LAST GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER +/*! @} */ + +/*! @defgroup errors Error codes + * @brief Error codes. + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief No error has occurred. + * + * No error has occurred. + * + * @analysis Yay. + */ +#define GLFW_NO_ERROR 0 +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that must not be called unless the + * library is [initialized](@ref intro_init). + * + * @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. + * + * @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 @ref GLFW_RED_BITS with @ref glfwGetWindowAttrib. + * + * @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. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_INVALID_VALUE 0x00010004 +/*! @brief A memory allocation failed. + * + * A memory allocation failed. + * + * @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 API on the system. + * + * GLFW could not find support for the requested API on the system. + * + * @analysis The installed graphics driver does not support the requested + * API, or does not support it via the chosen context creation API. + * 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 support it via + * a WGL or GLX extension. macOS does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. Older graphics drivers do not support Vulkan. + */ +#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. + * + * @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. + * + * @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. + * + * @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 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + * A window that does not have an OpenGL or OpenGL ES context was passed to + * a function that requires it to have one. + * + * @analysis Application programmer error. Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT 0x0001000A +/*! @brief The specified cursor shape is not available. + * + * The specified standard cursor shape is not available, either because the + * current platform cursor theme does not provide it or because it is not + * available on the platform. + * + * @analysis Platform or system settings limitation. Pick another + * [standard cursor shape](@ref shapes) or create a + * [custom cursor](@ref cursor_custom). + */ +#define GLFW_CURSOR_UNAVAILABLE 0x0001000B +/*! @brief The requested feature is not provided by the platform. + * + * The requested feature is not provided by the platform, so GLFW is unable to + * implement it. The documentation for each function notes if it could emit + * this error. + * + * @analysis Platform or platform version limitation. The error can be ignored + * unless the feature is critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNAVAILABLE 0x0001000C +/*! @brief The requested feature is not implemented for the platform. + * + * The requested feature has not yet been implemented in GLFW for this platform. + * + * @analysis An incomplete implementation of GLFW for this platform, hopefully + * fixed in a future release. The error can be ignored unless the feature is + * critical to the application. + * + * @par + * A function call that emits this error has no effect other than the error and + * updating any existing out parameters. + */ +#define GLFW_FEATURE_UNIMPLEMENTED 0x0001000D +/*! @brief Platform unavailable or no matching platform was found. + * + * If emitted during initialization, no matching platform was found. If the @ref + * GLFW_PLATFORM init hint was set to `GLFW_ANY_PLATFORM`, GLFW could not detect any of + * the platforms supported by this library binary, except for the Null platform. If the + * init hint was set to a specific platform, it is either not supported by this library + * binary or GLFW was not able to detect it. + * + * If emitted by a native access function, GLFW was initialized for a different platform + * than the function is for. + * + * @analysis Failure to detect any platform usually only happens on non-macOS Unix + * systems, either when no window system is running or the program was run from + * a terminal that does not have the necessary environment variables. Fall back to + * a different platform if possible or notify the user that no usable platform was + * detected. + * + * Failure to detect a specific platform may have the same cause as above or be because + * support for that platform was not compiled in. Call @ref glfwPlatformSupported to + * check whether a specific platform is supported by a library binary. + */ +#define GLFW_PLATFORM_UNAVAILABLE 0x0001000E +/*! @} */ + +/*! @addtogroup window + * @{ */ +/*! @brief Input focus window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUSED_hint) or + * [window attribute](@ref GLFW_FOCUSED_attrib). + */ +#define GLFW_FOCUSED 0x00020001 +/*! @brief Window iconification window attribute + * + * Window iconification [window attribute](@ref GLFW_ICONIFIED_attrib). + */ +#define GLFW_ICONIFIED 0x00020002 +/*! @brief Window resize-ability window hint and attribute + * + * Window resize-ability [window hint](@ref GLFW_RESIZABLE_hint) and + * [window attribute](@ref GLFW_RESIZABLE_attrib). + */ +#define GLFW_RESIZABLE 0x00020003 +/*! @brief Window visibility window hint and attribute + * + * Window visibility [window hint](@ref GLFW_VISIBLE_hint) and + * [window attribute](@ref GLFW_VISIBLE_attrib). + */ +#define GLFW_VISIBLE 0x00020004 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_DECORATED_hint) and + * [window attribute](@ref GLFW_DECORATED_attrib). + */ +#define GLFW_DECORATED 0x00020005 +/*! @brief Window auto-iconification window hint and attribute + * + * Window auto-iconification [window hint](@ref GLFW_AUTO_ICONIFY_hint) and + * [window attribute](@ref GLFW_AUTO_ICONIFY_attrib). + */ +#define GLFW_AUTO_ICONIFY 0x00020006 +/*! @brief Window decoration window hint and attribute + * + * Window decoration [window hint](@ref GLFW_FLOATING_hint) and + * [window attribute](@ref GLFW_FLOATING_attrib). + */ +#define GLFW_FLOATING 0x00020007 +/*! @brief Window maximization window hint and attribute + * + * Window maximization [window hint](@ref GLFW_MAXIMIZED_hint) and + * [window attribute](@ref GLFW_MAXIMIZED_attrib). + */ +#define GLFW_MAXIMIZED 0x00020008 +/*! @brief Cursor centering window hint + * + * Cursor centering [window hint](@ref GLFW_CENTER_CURSOR_hint). + */ +#define GLFW_CENTER_CURSOR 0x00020009 +/*! @brief Window framebuffer transparency hint and attribute + * + * Window framebuffer transparency + * [window hint](@ref GLFW_TRANSPARENT_FRAMEBUFFER_hint) and + * [window attribute](@ref GLFW_TRANSPARENT_FRAMEBUFFER_attrib). + */ +#define GLFW_TRANSPARENT_FRAMEBUFFER 0x0002000A +/*! @brief Mouse cursor hover window attribute. + * + * Mouse cursor hover [window attribute](@ref GLFW_HOVERED_attrib). + */ +#define GLFW_HOVERED 0x0002000B +/*! @brief Input focus on calling show window hint and attribute + * + * Input focus [window hint](@ref GLFW_FOCUS_ON_SHOW_hint) or + * [window attribute](@ref GLFW_FOCUS_ON_SHOW_attrib). + */ +#define GLFW_FOCUS_ON_SHOW 0x0002000C + +/*! @brief Mouse input transparency window hint and attribute + * + * Mouse input transparency [window hint](@ref GLFW_MOUSE_PASSTHROUGH_hint) or + * [window attribute](@ref GLFW_MOUSE_PASSTHROUGH_attrib). + */ +#define GLFW_MOUSE_PASSTHROUGH 0x0002000D + +/*! @brief Initial position x-coordinate window hint. + * + * Initial position x-coordinate [window hint](@ref GLFW_POSITION_X). + */ +#define GLFW_POSITION_X 0x0002000E + +/*! @brief Initial position y-coordinate window hint. + * + * Initial position y-coordinate [window hint](@ref GLFW_POSITION_Y). + */ +#define GLFW_POSITION_Y 0x0002000F + +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_RED_BITS). + */ +#define GLFW_RED_BITS 0x00021001 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_GREEN_BITS). + */ +#define GLFW_GREEN_BITS 0x00021002 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_BLUE_BITS). + */ +#define GLFW_BLUE_BITS 0x00021003 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ALPHA_BITS). + */ +#define GLFW_ALPHA_BITS 0x00021004 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_DEPTH_BITS). + */ +#define GLFW_DEPTH_BITS 0x00021005 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_STENCIL_BITS). + */ +#define GLFW_STENCIL_BITS 0x00021006 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_RED_BITS). + */ +#define GLFW_ACCUM_RED_BITS 0x00021007 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_GREEN_BITS). + */ +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_BLUE_BITS). + */ +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +/*! @brief Framebuffer bit depth hint. + * + * Framebuffer bit depth [hint](@ref GLFW_ACCUM_ALPHA_BITS). + */ +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +/*! @brief Framebuffer auxiliary buffer hint. + * + * Framebuffer auxiliary buffer [hint](@ref GLFW_AUX_BUFFERS). + */ +#define GLFW_AUX_BUFFERS 0x0002100B +/*! @brief OpenGL stereoscopic rendering hint. + * + * OpenGL stereoscopic rendering [hint](@ref GLFW_STEREO). + */ +#define GLFW_STEREO 0x0002100C +/*! @brief Framebuffer MSAA samples hint. + * + * Framebuffer MSAA samples [hint](@ref GLFW_SAMPLES). + */ +#define GLFW_SAMPLES 0x0002100D +/*! @brief Framebuffer sRGB hint. + * + * Framebuffer sRGB [hint](@ref GLFW_SRGB_CAPABLE). + */ +#define GLFW_SRGB_CAPABLE 0x0002100E +/*! @brief Monitor refresh rate hint. + * + * Monitor refresh rate [hint](@ref GLFW_REFRESH_RATE). + */ +#define GLFW_REFRESH_RATE 0x0002100F +/*! @brief Framebuffer double buffering hint and attribute. + * + * Framebuffer double buffering [hint](@ref GLFW_DOUBLEBUFFER_hint) and + * [attribute](@ref GLFW_DOUBLEBUFFER_attrib). + */ +#define GLFW_DOUBLEBUFFER 0x00021010 + +/*! @brief Context client API hint and attribute. + * + * Context client API [hint](@ref GLFW_CLIENT_API_hint) and + * [attribute](@ref GLFW_CLIENT_API_attrib). + */ +#define GLFW_CLIENT_API 0x00022001 +/*! @brief Context client API major version hint and attribute. + * + * Context client API major version [hint](@ref GLFW_CONTEXT_VERSION_MAJOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MAJOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +/*! @brief Context client API minor version hint and attribute. + * + * Context client API minor version [hint](@ref GLFW_CONTEXT_VERSION_MINOR_hint) + * and [attribute](@ref GLFW_CONTEXT_VERSION_MINOR_attrib). + */ +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +/*! @brief Context client API revision number attribute. + * + * Context client API revision number + * [attribute](@ref GLFW_CONTEXT_REVISION_attrib). + */ +#define GLFW_CONTEXT_REVISION 0x00022004 +/*! @brief Context robustness hint and attribute. + * + * Context client API revision number [hint](@ref GLFW_CONTEXT_ROBUSTNESS_hint) + * and [attribute](@ref GLFW_CONTEXT_ROBUSTNESS_attrib). + */ +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +/*! @brief OpenGL forward-compatibility hint and attribute. + * + * OpenGL forward-compatibility [hint](@ref GLFW_OPENGL_FORWARD_COMPAT_hint) + * and [attribute](@ref GLFW_OPENGL_FORWARD_COMPAT_attrib). + */ +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +/*! @brief Debug mode context hint and attribute. + * + * Debug mode context [hint](@ref GLFW_CONTEXT_DEBUG_hint) and + * [attribute](@ref GLFW_CONTEXT_DEBUG_attrib). + */ +#define GLFW_CONTEXT_DEBUG 0x00022007 +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_OPENGL_DEBUG_CONTEXT GLFW_CONTEXT_DEBUG +/*! @brief OpenGL profile hint and attribute. + * + * OpenGL profile [hint](@ref GLFW_OPENGL_PROFILE_hint) and + * [attribute](@ref GLFW_OPENGL_PROFILE_attrib). + */ +#define GLFW_OPENGL_PROFILE 0x00022008 +/*! @brief Context flush-on-release hint and attribute. + * + * Context flush-on-release [hint](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) and + * [attribute](@ref GLFW_CONTEXT_RELEASE_BEHAVIOR_attrib). + */ +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +/*! @brief Context error suppression hint and attribute. + * + * Context error suppression [hint](@ref GLFW_CONTEXT_NO_ERROR_hint) and + * [attribute](@ref GLFW_CONTEXT_NO_ERROR_attrib). + */ +#define GLFW_CONTEXT_NO_ERROR 0x0002200A +/*! @brief Context creation API hint and attribute. + * + * Context creation API [hint](@ref GLFW_CONTEXT_CREATION_API_hint) and + * [attribute](@ref GLFW_CONTEXT_CREATION_API_attrib). + */ +#define GLFW_CONTEXT_CREATION_API 0x0002200B +/*! @brief Window content area scaling window + * [window hint](@ref GLFW_SCALE_TO_MONITOR). + */ +#define GLFW_SCALE_TO_MONITOR 0x0002200C +/*! @brief Window framebuffer scaling + * [window hint](@ref GLFW_SCALE_FRAMEBUFFER_hint). + */ +#define GLFW_SCALE_FRAMEBUFFER 0x0002200D +/*! @brief Legacy name for compatibility. + * + * This is an alias for the + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) window hint for + * compatibility with earlier versions. + */ +#define GLFW_COCOA_RETINA_FRAMEBUFFER 0x00023001 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_FRAME_NAME_hint). + */ +#define GLFW_COCOA_FRAME_NAME 0x00023002 +/*! @brief macOS specific + * [window hint](@ref GLFW_COCOA_GRAPHICS_SWITCHING_hint). + */ +#define GLFW_COCOA_GRAPHICS_SWITCHING 0x00023003 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_CLASS_NAME 0x00024001 +/*! @brief X11 specific + * [window hint](@ref GLFW_X11_CLASS_NAME_hint). + */ +#define GLFW_X11_INSTANCE_NAME 0x00024002 +#define GLFW_WIN32_KEYBOARD_MENU 0x00025001 +/*! @brief Win32 specific [window hint](@ref GLFW_WIN32_SHOWDEFAULT_hint). + */ +#define GLFW_WIN32_SHOWDEFAULT 0x00025002 +/*! @brief Wayland specific + * [window hint](@ref GLFW_WAYLAND_APP_ID_hint). + * + * Allows specification of the Wayland app_id. + */ +#define GLFW_WAYLAND_APP_ID 0x00026001 +/*! @} */ + +#define GLFW_NO_API 0 +#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_LOCK_KEY_MODS 0x00033004 +#define GLFW_RAW_MOUSE_MOTION 0x00033005 + +#define GLFW_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 +#define GLFW_CURSOR_CAPTURED 0x00034004 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +#define GLFW_NATIVE_CONTEXT_API 0x00036001 +#define GLFW_EGL_CONTEXT_API 0x00036002 +#define GLFW_OSMESA_CONTEXT_API 0x00036003 + +#define GLFW_ANGLE_PLATFORM_TYPE_NONE 0x00037001 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGL 0x00037002 +#define GLFW_ANGLE_PLATFORM_TYPE_OPENGLES 0x00037003 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D9 0x00037004 +#define GLFW_ANGLE_PLATFORM_TYPE_D3D11 0x00037005 +#define GLFW_ANGLE_PLATFORM_TYPE_VULKAN 0x00037007 +#define GLFW_ANGLE_PLATFORM_TYPE_METAL 0x00037008 + +#define GLFW_WAYLAND_PREFER_LIBDECOR 0x00038001 +#define GLFW_WAYLAND_DISABLE_LIBDECOR 0x00038002 + +#define GLFW_ANY_POSITION 0x80000000 + +/*! @defgroup shapes Standard cursor shapes + * @brief Standard system cursor shapes. + * + * These are the [standard cursor shapes](@ref cursor_standard) that can be + * requested from the platform (window system). + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor shape. + */ +#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 cursor shape. + * + * The crosshair cursor shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The pointing hand cursor shape. + * + * The pointing hand cursor shape. + */ +#define GLFW_POINTING_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize/move arrow shape. + * + * The horizontal resize/move arrow shape. This is usually a horizontal + * double-headed arrow. + */ +#define GLFW_RESIZE_EW_CURSOR 0x00036005 +/*! @brief The vertical resize/move arrow shape. + * + * The vertical resize/move shape. This is usually a vertical double-headed + * arrow. + */ +#define GLFW_RESIZE_NS_CURSOR 0x00036006 +/*! @brief The top-left to bottom-right diagonal resize/move arrow shape. + * + * The top-left to bottom-right diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NWSE_CURSOR 0x00036007 +/*! @brief The top-right to bottom-left diagonal resize/move arrow shape. + * + * The top-right to bottom-left diagonal resize/move shape. This is usually + * a diagonal double-headed arrow. + * + * @note @macos This shape is provided by a private system API and may fail + * with @ref GLFW_CURSOR_UNAVAILABLE in the future. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_RESIZE_NESW_CURSOR 0x00036008 +/*! @brief The omni-directional resize/move cursor shape. + * + * The omni-directional resize cursor/move shape. This is usually either + * a combined horizontal and vertical double-headed arrow or a grabbing hand. + */ +#define GLFW_RESIZE_ALL_CURSOR 0x00036009 +/*! @brief The operation-not-allowed shape. + * + * The operation-not-allowed shape. This is usually a circle with a diagonal + * line through it. + * + * @note @wayland This shape is provided by a newer standard not supported by + * all cursor themes. + * + * @note @x11 This shape is provided by a newer standard not supported by all + * cursor themes. + */ +#define GLFW_NOT_ALLOWED_CURSOR 0x0003600A +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HRESIZE_CURSOR GLFW_RESIZE_EW_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_VRESIZE_CURSOR GLFW_RESIZE_NS_CURSOR +/*! @brief Legacy name for compatibility. + * + * This is an alias for compatibility with earlier versions. + */ +#define GLFW_HAND_CURSOR GLFW_POINTING_HAND_CURSOR +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +/*! @addtogroup init + * @{ */ +/*! @brief Joystick hat buttons init hint. + * + * Joystick hat buttons [init hint](@ref GLFW_JOYSTICK_HAT_BUTTONS). + */ +#define GLFW_JOYSTICK_HAT_BUTTONS 0x00050001 +/*! @brief ANGLE rendering backend init hint. + * + * ANGLE rendering backend [init hint](@ref GLFW_ANGLE_PLATFORM_TYPE_hint). + */ +#define GLFW_ANGLE_PLATFORM_TYPE 0x00050002 +/*! @brief Platform selection init hint. + * + * Platform selection [init hint](@ref GLFW_PLATFORM). + */ +#define GLFW_PLATFORM 0x00050003 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_CHDIR_RESOURCES_hint). + */ +#define GLFW_COCOA_CHDIR_RESOURCES 0x00051001 +/*! @brief macOS specific init hint. + * + * macOS specific [init hint](@ref GLFW_COCOA_MENUBAR_hint). + */ +#define GLFW_COCOA_MENUBAR 0x00051002 +/*! @brief X11 specific init hint. + * + * X11 specific [init hint](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint). + */ +#define GLFW_X11_XCB_VULKAN_SURFACE 0x00052001 +/*! @brief Wayland specific init hint. + * + * Wayland specific [init hint](@ref GLFW_WAYLAND_LIBDECOR_hint). + */ +#define GLFW_WAYLAND_LIBDECOR 0x00053001 +/*! @} */ + +/*! @addtogroup init + * @{ */ +/*! @brief Hint value that enables automatic platform selection. + * + * Hint value for @ref GLFW_PLATFORM that enables automatic platform selection. + */ +#define GLFW_ANY_PLATFORM 0x00060000 +#define GLFW_PLATFORM_WIN32 0x00060001 +#define GLFW_PLATFORM_COCOA 0x00060002 +#define GLFW_PLATFORM_WAYLAND 0x00060003 +#define GLFW_PLATFORM_X11 0x00060004 +#define GLFW_PLATFORM_NULL 0x00060005 +/*! @} */ + +#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. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 3.0. + * + * @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + * Generic function pointer used for returning Vulkan API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref vulkan_proc + * @sa @ref glfwGetInstanceProcAddress + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + * Opaque monitor object. + * + * @see @ref monitor_object + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + * Opaque window object. + * + * @see @ref window_object + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + * Opaque cursor object. + * + * @see @ref cursor_object + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function pointer type for memory allocation callbacks. + * + * This is the function pointer type for memory allocation callbacks. A memory + * allocation callback function has the following signature: + * @code + * void* function_name(size_t size, void* user) + * @endcode + * + * This function must return either a memory block at least `size` bytes long, + * or `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `malloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The size will always be greater than zero. Allocations of size zero are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] size The minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated memory block, or `NULL` if an + * error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWallocatefun)(size_t size, void* user); + +/*! @brief The function pointer type for memory reallocation callbacks. + * + * This is the function pointer type for memory reallocation callbacks. + * A memory reallocation callback function has the following signature: + * @code + * void* function_name(void* block, size_t size, void* user) + * @endcode + * + * This function must return a memory block at least `size` bytes long, or + * `NULL` if allocation failed. Note that not all parts of GLFW handle allocation + * failures gracefully yet. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * Any memory allocated via this function will be deallocated via the same allocator + * during library termination or earlier. + * + * Any memory allocated via this function must be suitably aligned for any object type. + * If you are using C99 or earlier, this alignment is platform-dependent but will be the + * same as what `realloc` provides. If you are using C11 or later, this is the value of + * `alignof(max_align_t)`. + * + * The block address will never be `NULL` and the size will always be greater than zero. + * Reallocations of a block to size zero are converted into deallocations before reaching + * the custom allocator. Reallocations of `NULL` to a non-zero size are converted into + * regular allocations before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to reallocate. + * @param[in] size The new minimum size, in bytes, of the memory block. + * @param[in] user The user-defined pointer from the allocator. + * @return The address of the newly allocated or resized memory block, or + * `NULL` if an error occurred. + * + * @pointer_lifetime The returned memory block must be valid at least until it + * is deallocated. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void* (* GLFWreallocatefun)(void* block, size_t size, void* user); + +/*! @brief The function pointer type for memory deallocation callbacks. + * + * This is the function pointer type for memory deallocation callbacks. + * A memory deallocation callback function has the following signature: + * @code + * void function_name(void* block, void* user) + * @endcode + * + * This function may deallocate the specified memory block. This memory block + * will have been allocated with the same allocator. + * + * This function must support being called during @ref glfwInit but before the library is + * flagged as initialized, as well as during @ref glfwTerminate after the library is no + * longer flagged as initialized. + * + * The block address will never be `NULL`. Deallocations of `NULL` are filtered out + * before reaching the custom allocator. + * + * If this function returns `NULL`, GLFW will emit @ref GLFW_OUT_OF_MEMORY. + * + * This function must not call any GLFW function. + * + * @param[in] block The address of the memory block to deallocate. + * @param[in] user The user-defined pointer from the allocator. + * + * @pointer_lifetime The specified memory block will not be accessed by GLFW + * after this function is called. + * + * @reentrancy This function should not call any GLFW function. + * + * @thread_safety This function must support being called from any thread that calls GLFW + * functions. + * + * @sa @ref init_allocator + * @sa @ref GLFWallocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef void (* GLFWdeallocatefun)(void* block, void* user); + +/*! @brief The function pointer type for error callbacks. + * + * This is the function pointer type for error callbacks. An error callback + * function has the following signature: + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * + * @param[in] error_code An [error code](@ref errors). Future releases may add + * more error codes. + * @param[in] description A UTF-8 encoded string describing the error. + * + * @pointer_lifetime The error description string is valid until the callback + * function returns. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int error_code, const char* description); + +/*! @brief The function pointer type for window position callbacks. + * + * This is the function pointer type for window position callbacks. A window + * position callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * + * @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 content area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the content area of the window. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow* window, int xpos, int ypos); + +/*! @brief The function pointer type for window size callbacks. + * + * This is the function pointer type for window size callbacks. A window size + * callback function has the following signature: + * @code + * void callback_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @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 @ref window_size + * @sa @ref glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window close callbacks. + * + * This is the function pointer type for window close callbacks. A window + * close callback function has the following signature: + * @code + * void function_name(GLFWwindow* window) + * @endcode + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa @ref glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow* window); + +/*! @brief The function pointer type for window content refresh callbacks. + * + * This is the function pointer type for window content refresh callbacks. + * A window content refresh callback function has the following signature: + * @code + * void function_name(GLFWwindow* window); + * @endcode + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa @ref glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow* window); + +/*! @brief The function pointer type for window focus callbacks. + * + * This is the function pointer type for window focus callbacks. A window + * focus callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa @ref glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow* window, int focused); + +/*! @brief The function pointer type for window iconify callbacks. + * + * This is the function pointer type for window iconify callbacks. A window + * iconify callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa @ref glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow* window, int iconified); + +/*! @brief The function pointer type for window maximize callbacks. + * + * This is the function pointer type for window maximize callbacks. A window + * maximize callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * + * @param[in] window The window that was maximized or restored. + * @param[in] maximized `GLFW_TRUE` if the window was maximized, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_maximize + * @sa glfwSetWindowMaximizeCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowmaximizefun)(GLFWwindow* window, int maximized); + +/*! @brief The function pointer type for framebuffer size callbacks. + * + * This is the function pointer type for framebuffer size callbacks. + * A framebuffer size callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * + * @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 @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow* window, int width, int height); + +/*! @brief The function pointer type for window content scale callbacks. + * + * This is the function pointer type for window content scale callbacks. + * A window content scale callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * + * @param[in] window The window whose content scale changed. + * @param[in] xscale The new x-axis content scale of the window. + * @param[in] yscale The new y-axis content scale of the window. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * + * @since Added in version 3.3. + * + * @ingroup window + */ +typedef void (* GLFWwindowcontentscalefun)(GLFWwindow* window, float xscale, float yscale); + +/*! @brief The function pointer type for mouse button callbacks. + * + * This is the function pointer type for mouse button callback functions. + * A mouse button callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * + * @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`. Future releases + * may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa @ref glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow* window, int button, int action, int mods); + +/*! @brief The function pointer type for cursor position callbacks. + * + * This is the function pointer type for cursor position callbacks. A cursor + * position callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the content area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * content area. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow* window, double xpos, double ypos); + +/*! @brief The function pointer type for cursor enter/leave callbacks. + * + * This is the function pointer type for cursor enter/leave callbacks. + * A cursor enter/leave callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's content + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa @ref glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow* window, int entered); + +/*! @brief The function pointer type for scroll callbacks. + * + * This is the function pointer type for scroll callbacks. A scroll callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * + * @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 @ref scrolling + * @sa @ref glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow* window, double xoffset, double yoffset); + +/*! @brief The function pointer type for keyboard key callbacks. + * + * This is the function pointer type for keyboard key callbacks. A keyboard + * key callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * + * @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 platform-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. Future + * releases may add more actions. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa @ref glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow* window, int key, int scancode, int action, int mods); + +/*! @brief The function pointer type for Unicode character callbacks. + * + * This is the function pointer type for Unicode character callbacks. + * A Unicode character callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa @ref glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow* window, unsigned int codepoint); + +/*! @brief The function pointer type for Unicode character with modifiers + * callbacks. + * + * This is the function pointer type for Unicode character with modifiers + * callbacks. It is called for each input character, regardless of what + * modifier keys are held down. A Unicode character with modifiers callback + * function has the following signature: + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * + * @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 @ref input_char + * @sa @ref glfwSetCharModsCallback + * + * @deprecated Scheduled for removal in version 4.0. + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow* window, unsigned int codepoint, int mods); + +/*! @brief The function pointer type for path drop callbacks. + * + * This is the function pointer type for path drop callbacks. A path drop + * callback function has the following signature: + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * + * @param[in] window The window that received the event. + * @param[in] path_count The number of dropped paths. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @pointer_lifetime The path array and its strings are valid until the + * callback function returns. + * + * @sa @ref path_drop + * @sa @ref glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow* window, int path_count, const char* paths[]); + +/*! @brief The function pointer type for monitor configuration callbacks. + * + * This is the function pointer type for monitor configuration callbacks. + * A monitor callback function has the following signature: + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref monitor_event + * @sa @ref glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor* monitor, int event); + +/*! @brief The function pointer type for joystick configuration callbacks. + * + * This is the function pointer type for joystick configuration callbacks. + * A joystick configuration callback function has the following signature: + * @code + * void function_name(int jid, int event) + * @endcode + * + * @param[in] jid The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. Future + * releases may add more events. + * + * @sa @ref joystick_event + * @sa @ref glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int jid, int event); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * @sa @ref glfwGetVideoModes + * + * @since Added in version 1.0. + * @glfw3 Added refresh rate member. + * + * @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 @ref monitor_gamma + * @sa @ref glfwGetGammaRamp + * @sa @ref glfwSetGammaRamp + * + * @since Added in version 3.0. + * + * @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. + * + * This describes a single 2D image. See the documentation for each related + * function what the expected pixel format is. + * + * @sa @ref cursor_custom + * @sa @ref window_icon + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + * + * @ingroup window + */ +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; + +/*! @brief Gamepad input state + * + * This describes the input state of a gamepad. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +typedef struct GLFWgamepadstate +{ + /*! The states of each [gamepad button](@ref gamepad_buttons), `GLFW_PRESS` + * or `GLFW_RELEASE`. + */ + unsigned char buttons[15]; + /*! The states of each [gamepad axis](@ref gamepad_axes), in the range -1.0 + * to 1.0 inclusive. + */ + float axes[6]; +} GLFWgamepadstate; + +/*! @brief Custom heap memory allocator. + * + * This describes a custom heap memory allocator for GLFW. To set an allocator, pass it + * to @ref glfwInitAllocator before initializing the library. + * + * @sa @ref init_allocator + * @sa @ref glfwInitAllocator + * + * @since Added in version 3.4. + * + * @ingroup init + */ +typedef struct GLFWallocator +{ + /*! The memory allocation function. See @ref GLFWallocatefun for details about + * allocation function. + */ + GLFWallocatefun allocate; + /*! The memory reallocation function. See @ref GLFWreallocatefun for details about + * reallocation function. + */ + GLFWreallocatefun reallocate; + /*! The memory deallocation function. See @ref GLFWdeallocatefun for details about + * deallocation function. + */ + GLFWdeallocatefun deallocate; + /*! The user pointer for this custom allocator. This value will be passed to the + * allocator functions. + */ + void* user; +} GLFWallocator; + + +/************************************************************************* + * 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 `GLFW_TRUE` immediately. + * + * The @ref GLFW_PLATFORM init hint controls which platforms are considered during + * initialization. This also depends on which platforms the library was compiled to + * support. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos 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 the @ref + * GLFW_COCOA_CHDIR_RESOURCES init hint. + * + * @remark @macos This function will create the main menu and dock icon for the + * application. If GLFW finds a `MainMenu.nib` it is loaded and assumed to + * contain a menu bar. Otherwise a minimal menu bar is created manually 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 + * and dock icon can be disabled entirely with the @ref GLFW_COCOA_MENUBAR init + * hint. + * + * @remark __Wayland, X11:__ If the library was compiled with support for both + * Wayland and X11, and the @ref GLFW_PLATFORM init hint is set to + * `GLFW_ANY_PLATFORM`, the `XDG_SESSION_TYPE` environment variable affects + * which platform is picked. If the environment variable is not set, or is set + * to something other than `wayland` or `x11`, the regular detection mechanism + * will be used instead. + * + * @remark @x11 This function will set the `LC_CTYPE` category of the + * application locale according to the current environment if that category is + * still "C". This is because the "C" locale breaks Unicode text input. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInitHint + * @sa @ref glfwInitAllocator + * @sa @ref glfwTerminate + * + * @since Added in version 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. + * + * This function has no effect if GLFW is not initialized. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark This function may be called before @ref glfwInit. + * + * @warning The contexts of any remaining windows must not be current on any + * other thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa @ref glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Sets the specified init hint to the desired value. + * + * This function sets hints for the next initialization of GLFW. + * + * The values you set hints to are never reset by GLFW, but they only take + * effect during initialization. Once GLFW has been initialized, any values + * you set will be ignored until the library is terminated and initialized + * again. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [init hint](@ref init_hints) to set. + * @param[in] value The new value of the init hint. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM and @ref + * GLFW_INVALID_VALUE. + * + * @remarks This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa init_hints + * @sa glfwInit + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI void glfwInitHint(int hint, int value); + +/*! @brief Sets the init allocator to the desired value. + * + * To use the default allocator, call this function with a `NULL` argument. + * + * If you specify an allocator struct, every member must be a valid function + * pointer. If any member is `NULL`, this function will emit @ref + * GLFW_INVALID_VALUE and the init allocator will be unchanged. + * + * The functions in the allocator must fulfil a number of requirements. See the + * documentation for @ref GLFWallocatefun, @ref GLFWreallocatefun and @ref + * GLFWdeallocatefun for details. + * + * @param[in] allocator The allocator to use at the next initialization, or + * `NULL` to use the default one. + * + * @errors Possible errors include @ref GLFW_INVALID_VALUE. + * + * @pointer_lifetime The specified allocator is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref init_allocator + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitAllocator(const GLFWallocator* allocator); + +#if defined(VK_VERSION_1_0) + +/*! @brief Sets the desired Vulkan `vkGetInstanceProcAddr` function. + * + * This function sets the `vkGetInstanceProcAddr` function that GLFW will use for all + * Vulkan related entry point queries. + * + * This feature is mostly useful on macOS, if your copy of the Vulkan loader is in + * a location where GLFW cannot find it through dynamic loading, or if you are still + * using the static library version of the loader. + * + * If set to `NULL`, GLFW will try to load the Vulkan loader dynamically by its standard + * name and get this function from there. This is the default behavior. + * + * The standard name of the loader is `vulkan-1.dll` on Windows, `libvulkan.so.1` on + * Linux and other Unix-like systems and `libvulkan.1.dylib` on macOS. If your code is + * also loading it via these names then you probably don't need to use this function. + * + * The function address you set is never reset by GLFW, but it only takes effect during + * initialization. Once GLFW has been initialized, any updates will be ignored until the + * library is terminated and initialized again. + * + * @param[in] loader The address of the function to use, or `NULL`. + * + * @par Loader function signature + * @code + * PFN_vkVoidFunction vkGetInstanceProcAddr(VkInstance instance, const char* name) + * @endcode + * For more information about this function, see the + * [Vulkan Registry](https://www.khronos.org/registry/vulkan/). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref vulkan_loader + * @sa @ref glfwInit + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI void glfwInitVulkanLoader(PFN_vkGetInstanceProcAddr loader); + +#endif /*VK_VERSION_1_0*/ + +/*! @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`. + * + * @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`. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersionString + * + * @since Added in version 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, platforms, compiler and any platform or operating system specific + * compile-time options. It should not be confused with the OpenGL or OpenGL ES version + * string, queried with `glGetString`. + * + * __Do not use the version string__ to parse the GLFW library version. The + * @ref glfwGetVersion function provides the version of the running library + * binary in numerical format. + * + * __Do not use the version string__ to parse what platforms are supported. The @ref + * glfwPlatformSupported function lets you query platform support. + * + * @return The ASCII encoded GLFW version string. + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @pointer_lifetime The returned string is static and compile-time generated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref intro_version + * @sa @ref glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Returns and clears the last error for the calling thread. + * + * This function returns and clears the [error code](@ref errors) of the last + * error that occurred on the calling thread, and optionally a UTF-8 encoded + * human-readable description of it. If no error has occurred since the last + * call, it returns @ref GLFW_NO_ERROR (zero) and the description pointer is + * set to `NULL`. + * + * @param[in] description Where to store the error description pointer, or `NULL`. + * @return The last error code for the calling thread, or @ref GLFW_NO_ERROR + * (zero). + * + * @errors None. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is guaranteed to be valid only until the + * next error occurs or the library is terminated. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref error_handling + * @sa @ref glfwSetErrorCallback + * + * @since Added in version 3.3. + * + * @ingroup init + */ +GLFWAPI int glfwGetError(const char** description); + +/*! @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 code is set before the callback is called. Calling @ref + * glfwGetError from the error callback will return the same value as the error + * code argument. + * + * 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] callback The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @callback_signature + * @code + * void callback_name(int error_code, const char* description) + * @endcode + * For more information about the callback parameters, see the + * [callback pointer type](@ref GLFWerrorfun). + * + * @errors None. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref error_handling + * @sa @ref glfwGetError + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun callback); + +/*! @brief Returns the currently selected platform. + * + * This function returns the platform that was selected during initialization. The + * returned value will be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @return The currently selected platform, or zero if an error occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwPlatformSupported + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwGetPlatform(void); + +/*! @brief Returns whether the library includes support for the specified platform. + * + * This function returns whether the library was compiled with support for the specified + * platform. The platform must be one of `GLFW_PLATFORM_WIN32`, `GLFW_PLATFORM_COCOA`, + * `GLFW_PLATFORM_WAYLAND`, `GLFW_PLATFORM_X11` or `GLFW_PLATFORM_NULL`. + * + * @param[in] platform The platform to query. + * @return `GLFW_TRUE` if the platform is supported, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_INVALID_ENUM. + * + * @remark This function may be called before @ref glfwInit. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref platform + * @sa @ref glfwGetPlatform + * + * @since Added in version 3.4. + * + * @ingroup init + */ +GLFWAPI int glfwPlatformSupported(int platform); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. The primary monitor is always first in the returned array. If no + * monitors were found, this function returns `NULL`. + * + * @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 no monitors were found or + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_monitors + * @sa @ref monitor_event + * @sa @ref glfwGetPrimaryMonitor + * + * @since Added in version 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 task bar or global menu bar are located. + * + * @return The primary monitor, or `NULL` if no monitors were found or if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @remark The primary monitor is always first in the array returned by @ref + * glfwGetMonitors. + * + * @sa @ref monitor_monitors + * @sa @ref glfwGetMonitors + * + * @since Added in version 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Retrieves the work area of the monitor. + * + * This function returns the position, in screen coordinates, of the upper-left + * corner of the work area of the specified monitor along with the work area + * size in screen coordinates. The work area is defined as the area of the + * monitor not occluded by the window system task bar where present. If no + * task bar exists then the work area is the monitor resolution in screen + * coordinates. + * + * Any or all of the position and size arguments may be `NULL`. If an error + * occurs, all non-`NULL` position and size 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`. + * @param[out] width Where to store the monitor width, or `NULL`. + * @param[out] height Where to store the monitor height, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_workarea + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorWorkarea(GLFWmonitor* monitor, int* xpos, int* ypos, int* width, int* height); + +/*! @brief Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some platforms do not provide accurate monitor size information, either + * because the monitor [EDID][] data is incorrect or because the driver does + * not report it accurately. + * + * [EDID]: https://en.wikipedia.org/wiki/Extended_display_identification_data + * + * 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 On Windows 8 and earlier the physical size is calculated from + * the current resolution and system DPI instead of querying the monitor EDID data. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Retrieves the content scale for the specified monitor. + * + * This function retrieves the content scale for the specified monitor. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * The content scale may depend on both the monitor resolution and pixel + * density and on user settings. It may be very different from the raw DPI + * calculated from the physical size and current resolution. + * + * @param[in] monitor The monitor to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Fractional scaling information is not yet available for + * monitors, so this function only returns integer content scales. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwGetMonitorContentScale(GLFWmonitor* monitor, float* xscale, float* yscale); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_properties + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the user pointer of the specified monitor. + * + * This function sets the user-defined pointer of the specified monitor. The + * current value is retained until the monitor is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwGetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void glfwSetMonitorUserPointer(GLFWmonitor* monitor, void* pointer); + +/*! @brief Returns the user pointer of the specified monitor. + * + * This function returns the current value of the user-defined pointer of the + * specified monitor. The initial value is `NULL`. + * + * This function may be called from the monitor callback, even for a monitor + * that is being disconnected. + * + * @param[in] monitor The monitor whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref monitor_userptr + * @sa @ref glfwSetMonitorUserPointer + * + * @since Added in version 3.3. + * + * @ingroup monitor + */ +GLFWAPI void* glfwGetMonitorUserPointer(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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWmonitor* monitor, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmonitorfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_event + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun callback); + +/*! @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), then by resolution area (the + * product of width and height), then resolution width and finally by refresh + * rate. + * + * @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoMode + * + * @since Added in version 1.0. + * @glfw3 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_modes + * @sa @ref glfwGetVideoModes + * + * @since Added in version 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 an appropriately sized gamma ramp from the specified + * exponent and then calls @ref glfwSetGammaRamp with it. The value must be + * a finite number greater than zero. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_INVALID_VALUE, + * @ref GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE while + * returning `NULL`. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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. + * + * The software controlled gamma ramp is applied _in addition_ to the hardware + * gamma correction, which today is usually an approximation of sRGB gamma. + * This means that setting a perfectly linear ramp, or gamma 1.0, will produce + * the default (usually sRGB-like) behavior. + * + * For gamma correct rendering with OpenGL or OpenGL ES, see the @ref + * GLFW_SRGB_CAPABLE hint. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] ramp The gamma ramp to use. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref GLFW_PLATFORM_ERROR + * and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark The size of the specified gamma ramp should match the size of the + * current ramp for that monitor. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @remark @wayland Gamma handling is a privileged protocol, this function + * will thus never be implemented and emits @ref GLFW_FEATURE_UNAVAILABLE. + * + * @pointer_lifetime The specified gamma ramp is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref monitor_gamma + * + * @since Added in version 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). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwWindowHintString + * + * @since Added in version 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 this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only integer value hints can be set with this function. String value hints + * are set with @ref glfwWindowHintString. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHintString + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @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 this + * function or @ref glfwDefaultWindowHints, or until the library is terminated. + * + * Only string type hints can be set with this function. Integer value hints + * are set with @ref glfwWindowHint. + * + * This function does not check whether the specified hint values are valid. + * If you set hints to invalid values this will instead be reported by the next + * call to @ref glfwCreateWindow. + * + * Some hints are platform specific. These may be set on any platform but they + * will only affect their specific platform. Other platforms will ignore them. + * Setting these hints requires no platform specific headers or functions. + * + * @param[in] hint The [window hint](@ref window_hints) to set. + * @param[in] value The new value of the window hint. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hints + * @sa @ref glfwWindowHint + * @sa @ref glfwDefaultWindowHints + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHintString(int hint, const char* value); + +/*! @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, see @ref + * glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + * To create a full screen window, you need to specify the monitor the window + * will cover. If no monitor is specified, the window will be windowed mode. + * 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 is not + * iconified, 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. + * + * Once you have created the window, you can switch it between windowed and + * full screen mode with @ref glfwSetWindowMonitor. This will not affect its + * OpenGL or OpenGL ES context. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, set the @ref + * GLFW_POSITION_X and @ref GLFW_POSITION_Y window hints before creation. To + * restore the default behavior, set either or both hints back to + * `GLFW_ANY_POSITION`. + * + * As long as at least one full screen window is not iconified, 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` for + * 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + * GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark @win32 Window creation will fail if the Microsoft GDI software + * OpenGL implementation is the only one available. + * + * @remark @win32 If the executable has an icon resource named `GLFW_ICON,` it + * will be set as the initial icon for the window. If no such icon is present, + * the `IDI_APPLICATION` icon will be used instead. To set a different icon, + * see @ref glfwSetWindowIcon. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @macos The OS only supports core profile contexts for OpenGL + * versions 3.2 and later. Before creating an OpenGL context of version 3.2 or + * later you must set the [GLFW_OPENGL_PROFILE](@ref GLFW_OPENGL_PROFILE_hint) + * hint accordingly. OpenGL 3.0 and 3.1 contexts are not supported at all + * on macOS. + * + * @remark @macos 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][bundle-guide] in the Mac Developer Library. + * + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ + * + * @remark @macos On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the + * [GLFW_SCALE_FRAMEBUFFER](@ref GLFW_SCALE_FRAMEBUFFER_hint) + * hint is `GLFW_TRUE` and the `NSHighResolutionCapable` key is enabled in the + * application bundle's `Info.plist`. For more information, see + * [High Resolution Guidelines for OS X][hidpi-guide] in the Mac Developer + * Library. The GLFW test and example programs use a custom `Info.plist` + * template for this, which can be found as `CMake/Info.plist.in` in the source + * tree. + * + * [hidpi-guide]: https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html + * + * @remark @macos When activating frame autosaving with + * [GLFW_COCOA_FRAME_NAME](@ref GLFW_COCOA_FRAME_NAME_hint), the specified + * window size and position may be overridden by previously saved values. + * + * @remark @wayland GLFW uses [libdecor][] where available to create its window + * decorations. This in turn uses server-side XDG decorations where available + * and provides high quality client-side decorations on compositors like GNOME. + * If both XDG decorations and libdecor are unavailable, GLFW falls back to + * a very simple set of window decorations that only support moving, resizing + * and the window manager's right-click menu. + * + * [libdecor]: https://gitlab.freedesktop.org/libdecor/libdecor + * + * @remark @x11 Some window managers will not respect the placement of + * initially hidden windows. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * a window to reach its requested state. This means you may not be able to + * query the final size, position or other attributes directly after window + * creation. + * + * @remark @x11 The class part of the `WM_CLASS` window property will by + * default be set to the window title passed to this function. The instance + * part will use the contents of the `RESOURCE_NAME` environment variable, if + * present and not empty, or fall back to the window title. Set the + * [GLFW_X11_CLASS_NAME](@ref GLFW_X11_CLASS_NAME_hint) and + * [GLFW_X11_INSTANCE_NAME](@ref GLFW_X11_INSTANCE_NAME_hint) window hints to + * override this. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwDestroyWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @note The context of the specified window must not be current on any other + * thread when this function is called. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_creation + * @sa @ref glfwCreateWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_close + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Returns the title of the specified window. + * + * This function returns the window title, encoded as UTF-8, of the specified + * window. This is the title set previously by @ref glfwCreateWindow + * or @ref glfwSetWindowTitle. + * + * @param[in] window The window to query. + * @return The UTF-8 encoded window title, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark The returned title is currently a copy of the title last set by @ref + * glfwCreateWindow or @ref glfwSetWindowTitle. It does not include any + * additional text which may be appended by the platform or another program. + * + * @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 + * glfwGetWindowTitle or @ref glfwSetWindowTitle, or until the library is + * terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * @sa @ref glfwSetWindowTitle + * + * @since Added in version 3.4. + * + * @ingroup window + */ +GLFWAPI const char* glfwGetWindowTitle(GLFWwindow* window); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos The window title will not be updated until the next time you + * process events. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_title + * @sa @ref glfwGetWindowTitle + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + * This function sets the icon of the specified window. If passed an array of + * candidate images, those of or closest to the sizes desired by the system are + * selected. If no images are specified, the window reverts to its default + * icon. + * + * The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. They are arranged canonically + * as packed sequential rows, starting from the top-left corner. + * + * The desired image sizes varies depending on platform and system settings. + * The selected images will be rescaled as needed. Good sizes include 16x16, + * 32x32 and 48x48. + * + * @param[in] window The window whose icon to set. + * @param[in] count The number of images in the specified array, or zero to + * revert to the default window icon. + * @param[in] images The images to create the icon from. This is ignored if + * count is zero. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @macos Regular windows do not have icons on macOS. This function + * will emit @ref GLFW_FEATURE_UNAVAILABLE. The dock icon will be the same as + * the application bundle's icon. For more information on bundles, see the + * [Bundle Programming Guide][bundle-guide] in the Mac Developer Library. + * + * [bundle-guide]: https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/ + * + * @remark @wayland There is no existing protocol to change an icon, the + * window will thus inherit the one defined in the application's desktop file. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_icon + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the content area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the content 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 content area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way for an application to retrieve the global + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the content area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the content 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 content area. + * @param[in] ypos The y-coordinate of the upper-left corner of the content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way for an application to set the global + * position of its windows. This function will emit @ref + * GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * @sa @ref glfwGetWindowPos + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the content area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the content 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 + * content area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwSetWindowSize + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + * This function sets the size limits of the content area of the specified + * window. If the window is full screen, the size limits only take effect + * once it is made windowed. If the window is not resizable, this function + * does nothing. + * + * The size limits are applied immediately to a windowed mode window and may + * cause it to be resized. + * + * The maximum dimensions must be greater than or equal to the minimum + * dimensions and all must be greater than or equal to zero. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the content + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * content area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The size limits will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowAspectRatio + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + * This function sets the required aspect ratio of the content area of the + * specified window. If the window is full screen, the aspect ratio only takes + * effect once it is made windowed. If the window is not resizable, this + * function does nothing. + * + * The aspect ratio is specified as a numerator and a denominator and both + * values must be greater than zero. For example, the common 16:9 aspect ratio + * is specified as 16 and 9, respectively. + * + * If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + * ratio limit is disabled. + * + * The aspect ratio is applied immediately to a windowed mode window and may + * cause it to be resized. + * + * @param[in] window The window to set limits for. + * @param[in] numer The numerator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * @param[in] denom The denominator of the desired aspect ratio, or + * `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @remark @wayland The aspect ratio will not be applied until the window is + * actually resized, either by the user or by the compositor. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa @ref glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the content area of the specified window. + * + * This function sets the size, in screen coordinates, of the content area of + * the specified window. + * + * For full screen windows, this function updates the resolution of its desired + * video mode and switches to the video mode closest to it, without affecting + * the window's context. As the context is unaffected, the bit depths of the + * framebuffer remain unchanged. + * + * If you wish to update the refresh rate of the desired video mode in addition + * to its resolution, see @ref glfwSetWindowMonitor. + * + * 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, in screen coordinates, of the window + * content area. + * @param[in] height The desired height, in screen coordinates, of the window + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * @sa @ref glfwGetWindowSize + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 1.0. + * @glfw3 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * @sa @ref glfwSetFramebufferSizeCallback + * + * @since Added in version 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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 3.1. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Retrieves the content scale for the specified window. + * + * This function retrieves the content scale for the specified window. The + * content scale is the ratio between the current DPI and the platform's + * default DPI. This is especially important for text and any UI elements. If + * the pixel dimensions of your UI scaled by this look appropriate on your + * machine then it should appear at a reasonable size on other machines + * regardless of their DPI and scaling settings. This relies on the system DPI + * and scaling settings being somewhat correct. + * + * On platforms where each monitors can have its own content scale, the window + * content scale will depend on which monitor the system considers the window + * to be on. + * + * @param[in] window The window to query. + * @param[out] xscale Where to store the x-axis content scale, or `NULL`. + * @param[out] yscale Where to store the y-axis content scale, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwSetWindowContentScaleCallback + * @sa @ref glfwGetMonitorContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowContentScale(GLFWwindow* window, float* xscale, float* yscale); + +/*! @brief Returns the opacity of the whole window. + * + * This function returns the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. If the system + * does not support whole window transparency, this function always returns one. + * + * The initial opacity value for newly created windows is one. + * + * @param[in] window The window to query. + * @return The opacity value of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwSetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI float glfwGetWindowOpacity(GLFWwindow* window); + +/*! @brief Sets the opacity of the whole window. + * + * This function sets the opacity of the window, including any decorations. + * + * The opacity (or alpha) value is a positive finite number between zero and + * one, where zero is fully transparent and one is fully opaque. + * + * The initial opacity value for newly created windows is one. + * + * A window created with framebuffer transparency may not use whole window + * transparency. The results of doing this are undefined. + * + * @param[in] window The window to set the opacity for. + * @param[in] opacity The desired opacity of the specified window. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland There is no way to set an opacity factor for a window. + * This function will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_transparency + * @sa @ref glfwGetWindowOpacity + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowOpacity(GLFWwindow* window, float opacity); + +/*! @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, GLFW restores the original + * video mode of the monitor. The window's desired video mode is set again + * when the window is restored. + * + * @param[in] window The window to iconify. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Once a window is iconified, @ref glfwRestoreWindow won’t + * be able to restore it. This is a design decision of the xdg-shell + * protocol. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwRestoreWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 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) or maximized. If the window is already restored, this function + * does nothing. + * + * If the specified window is an iconified full screen window, its desired + * video mode is set again for its monitor when the window is restored. + * + * @param[in] window The window to restore. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwMaximizeWindow + * + * @since Added in version 2.1. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + * This function maximizes the specified window if it was previously not + * maximized. If the window is already maximized, this function does nothing. + * + * If the specified window is a full screen window, this function does nothing. + * + * @param[in] window The window to maximize. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa @ref glfwIconifyWindow + * @sa @ref glfwRestoreWindow + * + * @since Added in GLFW 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(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. + * + * By default, windowed mode windows are focused when shown + * Set the [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) window hint + * to change this behavior for all newly created windows, or change the + * behavior for an existing window with @ref glfwSetWindowAttrib. + * + * @param[in] window The window to make visible. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland Because Wayland wants every frame of the desktop to be + * complete, this function does not immediately make the window visible. + * Instead it will become visible the next time the window framebuffer is + * updated after this call. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwHideWindow + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_hide + * @sa @ref glfwShowWindow + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + * This function brings the specified window to front and sets input focus. + * The window should already be visible and not iconified. + * + * By default, both windowed and full screen mode windows are focused when + * initially created. Set the [GLFW_FOCUSED](@ref GLFW_FOCUSED_hint) to + * disable this behavior. + * + * Also by default, windowed mode windows are focused when shown + * with @ref glfwShowWindow. Set the + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_hint) to disable this behavior. + * + * __Do not use this function__ to steal focus from other applications unless + * you are certain that is what the user wants. Focus stealing can be + * extremely disruptive. + * + * For a less disruptive way of getting the user's attention, see + * [attention requests](@ref window_attention). + * + * @param[in] window The window to give input focus. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @wayland The compositor will likely ignore focus requests unless + * another window created by the same application already has input focus. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * @sa @ref window_attention + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Requests user attention to the specified window. + * + * This function requests user attention to the specified window. On + * platforms where this is not supported, attention is requested to the + * application as a whole. + * + * Once the user has given attention, usually by focusing the window or + * application, the system will end the request automatically. + * + * @param[in] window The window to request attention to. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @macos Attention is requested to the application as a whole, not the + * specific window. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attention + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwRequestWindowAttention(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](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref glfwSetWindowMonitor + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + * This function sets the monitor that the window uses for full screen mode or, + * if the monitor is `NULL`, makes it windowed mode. + * + * When setting a monitor, this function updates the width, height and refresh + * rate of the desired video mode and switches to the video mode closest to it. + * The window position is ignored when setting a monitor. + * + * When the monitor is `NULL`, the position, width and height are used to + * place the window content area. The refresh rate is ignored when no monitor + * is specified. + * + * If you only wish to update the resolution of a full screen window or the + * size of a windowed mode window, see @ref glfwSetWindowSize. + * + * When a window transitions from full screen to windowed mode, this function + * restores any previous window settings such as whether it is decorated, + * floating, resizable, has size or aspect ratio limits, etc. + * + * @param[in] window The window whose monitor, size or video mode to set. + * @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + * @param[in] xpos The desired x-coordinate of the upper-left corner of the + * content area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * content area. + * @param[in] width The desired with, in screen coordinates, of the content + * area or video mode. + * @param[in] height The desired height, in screen coordinates, of the content + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode, + * or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark The OpenGL or OpenGL ES context will not be destroyed or otherwise + * affected by any resizing or mode switching, although you may need to update + * your viewport if the framebuffer size has changed. + * + * @remark @wayland The desired window position is ignored, as there is no way + * for an application to set this property. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_monitor + * @sa @ref window_full_screen + * @sa @ref glfwGetWindowMonitor + * @sa @ref glfwSetWindowSize + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark Framebuffer related hints are not window attributes. See @ref + * window_attribs_fb for more information. + * + * @remark Zero is a valid value for many window and context related + * attributes so you cannot use a return value of zero as an indication of + * errors. However, this function should not fail as long as it is passed + * valid arguments and the library has been [initialized](@ref intro_init). + * + * @remark @wayland The Wayland protocol provides no way to check whether a + * window is iconfied, so @ref GLFW_ICONIFIED always returns `GLFW_FALSE`. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwSetWindowAttrib + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets an attribute of the specified window. + * + * This function sets the value of an attribute of the specified window. + * + * The supported attributes are [GLFW_DECORATED](@ref GLFW_DECORATED_attrib), + * [GLFW_RESIZABLE](@ref GLFW_RESIZABLE_attrib), + * [GLFW_FLOATING](@ref GLFW_FLOATING_attrib), + * [GLFW_AUTO_ICONIFY](@ref GLFW_AUTO_ICONIFY_attrib) and + * [GLFW_FOCUS_ON_SHOW](@ref GLFW_FOCUS_ON_SHOW_attrib). + * [GLFW_MOUSE_PASSTHROUGH](@ref GLFW_MOUSE_PASSTHROUGH_attrib) + * + * Some of these attributes are ignored for full screen windows. The new + * value will take effect if the window is later made windowed. + * + * Some of these attributes are ignored for windowed mode windows. The new + * value will take effect if the window is later made full screen. + * + * @param[in] window The window to set the attribute for. + * @param[in] attrib A supported window attribute. + * @param[in] value `GLFW_TRUE` or `GLFW_FALSE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark Calling @ref glfwGetWindowAttrib will always return the latest + * value, even if that value is ignored by the current mode of the window. + * + * @remark @wayland The [GLFW_FLOATING](@ref GLFW_FLOATING_attrib) window attribute is + * not supported. Setting this will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * @sa @ref glfwGetWindowAttrib + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAttrib(GLFWwindow* window, int attrib, int value); + +/*! @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwGetWindowUserPointer + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref window_userptr + * @sa @ref glfwSetWindowUserPointer + * + * @since Added in version 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 + * position, in screen coordinates, of the upper-left corner of the content + * area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int xpos, int ypos) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @wayland This callback will never be called, as there is no way for + * an application to know its global position. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_pos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun callback); + +/*! @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 content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowsizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_size + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowclosefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @macos Selecting Quit from the application menu will trigger the + * close callback for all windows. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_close + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun callback); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the content 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, Aqua or Wayland, 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowrefreshfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_refresh + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int focused) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowfocusfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_focus + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int iconified) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowiconifyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_iconify + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun callback); + +/*! @brief Sets the maximize callback for the specified window. + * + * This function sets the maximization callback of the specified window, which + * is called when the window is maximized or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int maximized) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowmaximizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_maximize + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowmaximizefun glfwSetWindowMaximizeCallback(GLFWwindow* window, GLFWwindowmaximizefun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int width, int height) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWframebuffersizefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_fbsize + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun callback); + +/*! @brief Sets the window content scale callback for the specified window. + * + * This function sets the window content scale callback of the specified window, + * which is called when the content scale of the specified window changes. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, float xscale, float yscale) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWwindowcontentscalefun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_scale + * @sa @ref glfwGetWindowContentScale + * + * @since Added in version 3.3. + * + * @ingroup window + */ +GLFWAPI GLFWwindowcontentscalefun glfwSetWindowContentScaleCallback(GLFWwindow* window, GLFWwindowcontentscalefun callback); + +/*! @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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 2.5. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout 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, or until the specified timeout is reached. If + * 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. + * + * The timeout value must be a positive finite number. + * + * 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. + * + * Do not assume that callbacks you set will _only_ be called in response to + * event processing functions like this one. While it is necessary to poll for + * events, window systems that require GLFW to register callbacks of its own + * can pass events to GLFW in response to many window system function calls. + * GLFW will pass those events on to the application callbacks before + * returning. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref events + * @sa @ref glfwPollEvents + * @sa @ref glfwWaitEvents + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @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 or @ref glfwWaitEventsTimeout to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref events + * @sa @ref glfwWaitEvents + * @sa @ref glfwWaitEventsTimeout + * + * @since Added in version 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 @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwSetInputMode + * + * @since Added in version 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 @ref GLFW_CURSOR, @ref GLFW_STICKY_KEYS, + * @ref GLFW_STICKY_MOUSE_BUTTONS, @ref GLFW_LOCK_KEY_MODS or + * @ref GLFW_RAW_MOUSE_MOTION. + * + * 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 + * content 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. + * - `GLFW_CURSOR_CAPTURED` makes the cursor visible and confines it to the + * content area of the window. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + * enable sticky keys, or `GLFW_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 + * `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_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. + * + * If the mode is `GLFW_LOCK_KEY_MODS`, the value must be either `GLFW_TRUE` to + * enable lock key modifier bits, or `GLFW_FALSE` to disable them. If enabled, + * callbacks that receive modifier bits will also have the @ref + * GLFW_MOD_CAPS_LOCK bit set when the event was generated with Caps Lock on, + * and the @ref GLFW_MOD_NUM_LOCK bit when Num Lock was on. + * + * If the mode is `GLFW_RAW_MOUSE_MOTION`, the value must be either `GLFW_TRUE` + * to enable raw (unscaled and unaccelerated) mouse motion when the cursor is + * disabled, or `GLFW_FALSE` to disable it. If raw motion is not supported, + * attempting to set this will emit @ref GLFW_FEATURE_UNAVAILABLE. Call @ref + * glfwRawMouseMotionSupported to check for support. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS`, + * `GLFW_STICKY_MOUSE_BUTTONS`, `GLFW_LOCK_KEY_MODS` or + * `GLFW_RAW_MOUSE_MOTION`. + * @param[in] value The new value of the specified input mode. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_PLATFORM_ERROR and @ref + * GLFW_FEATURE_UNAVAILABLE (see above). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns whether raw mouse motion is supported. + * + * This function returns whether raw mouse motion is supported on the current + * system. This status does not change after GLFW has been initialized so you + * only need to check this once. If you attempt to enable raw motion on + * a system that does not support it, @ref GLFW_PLATFORM_ERROR will be emitted. + * + * Raw mouse motion is closer to the actual motion of the mouse across + * a surface. It is not affected by the scaling and acceleration applied to + * the motion of the desktop cursor. That processing is suitable for a cursor + * while raw motion is better for controlling for example a 3D camera. Because + * of this, raw mouse motion is only provided when the cursor is disabled. + * + * @return `GLFW_TRUE` if raw mouse motion is supported on the current machine, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref raw_mouse_motion + * @sa @ref glfwSetInputMode + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwRawMouseMotionSupported(void); + +/*! @brief Returns the layout-specific name of the specified printable key. + * + * This function returns the name of the specified printable key, encoded as + * UTF-8. This is typically the character that key would produce without any + * modifier keys, intended for displaying key bindings to the user. For dead + * keys, it is typically the diacritic it would add to a character. + * + * __Do not use this function__ for [text input](@ref input_char). You will + * break text input for many languages even if it happens to work for yours. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used to identify the key, + * otherwise the scancode is ignored. If you specify a non-printable key, or + * `GLFW_KEY_UNKNOWN` and a scancode that maps to a non-printable key, this + * function returns `NULL` but does not emit an error. + * + * This behavior allows you to always pass in the arguments in the + * [key callback](@ref input_key) without modification. + * + * The printable keys are: + * - `GLFW_KEY_APOSTROPHE` + * - `GLFW_KEY_COMMA` + * - `GLFW_KEY_MINUS` + * - `GLFW_KEY_PERIOD` + * - `GLFW_KEY_SLASH` + * - `GLFW_KEY_SEMICOLON` + * - `GLFW_KEY_EQUAL` + * - `GLFW_KEY_LEFT_BRACKET` + * - `GLFW_KEY_RIGHT_BRACKET` + * - `GLFW_KEY_BACKSLASH` + * - `GLFW_KEY_WORLD_1` + * - `GLFW_KEY_WORLD_2` + * - `GLFW_KEY_0` to `GLFW_KEY_9` + * - `GLFW_KEY_A` to `GLFW_KEY_Z` + * - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + * - `GLFW_KEY_KP_DECIMAL` + * - `GLFW_KEY_KP_DIVIDE` + * - `GLFW_KEY_KP_MULTIPLY` + * - `GLFW_KEY_KP_SUBTRACT` + * - `GLFW_KEY_KP_ADD` + * - `GLFW_KEY_KP_EQUAL` + * + * Names for printable keys depend on keyboard layout, while names for + * non-printable keys are the same across layouts but depend on the application + * language and should be localized along with other user interface text. + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The UTF-8 encoded, layout-specific name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE, @ref GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @remark The contents of the returned string may change when a keyboard + * layout change event is received. + * + * @pointer_lifetime The returned string is allocated and freed by GLFW. You + * should not free it yourself. It is valid until the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key_name + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the platform-specific scancode of the specified key. + * + * This function returns the platform-specific scancode of the specified key. + * + * If the specified [key token](@ref keys) corresponds to a physical key not + * supported on the current platform then this method will return `-1`. + * Calling this function with anything other than a key token will return `-1` + * and generate a @ref GLFW_INVALID_ENUM error. + * + * @param[in] key Any [key token](@ref keys). + * @return The platform-specific scancode for the key, or `-1` if the key is + * not supported on the current platform or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref input_key + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetKeyScancode(int key); + +/*! @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 action `GLFW_REPEAT` is only reported to the key callback. + * + * If the @ref 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. + * + * __Do not use this function__ to implement [text input](@ref input_char). + * + * @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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 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 @ref GLFW_STICKY_MOUSE_BUTTONS input mode is enabled, this function + * returns `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`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the content area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the content 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 content area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the content area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwSetCursorPos + * + * @since Added in version 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 content area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the content 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 + * content area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * content area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_ERROR and @ref GLFW_FEATURE_UNAVAILABLE (see remarks). + * + * @remark @wayland This function will only work when the cursor mode is + * `GLFW_CURSOR_DISABLED`, otherwise it will emit @ref GLFW_FEATURE_UNAVAILABLE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa @ref glfwGetCursorPos + * + * @since Added in version 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, non-premultiplied RGBA, i.e. eight + * bits per channel with the red channel first. 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwDestroyCursor + * @sa @ref glfwCreateStandardCursor + * + * @since Added in version 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, that can be set for a window with + * @ref glfwSetCursor. The images for these cursors come from the system + * cursor theme and their exact appearance will vary between platforms. + * + * Most of these shapes are guaranteed to exist on every supported platform but + * a few may not be present. See the table below for details. + * + * Cursor shape | Windows | macOS | X11 | Wayland + * ------------------------------ | ------- | ----- | ------ | ------- + * @ref GLFW_ARROW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_IBEAM_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_CROSSHAIR_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_POINTING_HAND_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_EW_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NS_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_RESIZE_NWSE_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_NESW_CURSOR | Yes | Yes1 | Maybe2 | Maybe2 + * @ref GLFW_RESIZE_ALL_CURSOR | Yes | Yes | Yes | Yes + * @ref GLFW_NOT_ALLOWED_CURSOR | Yes | Yes | Maybe2 | Maybe2 + * + * 1) This uses a private system API and may fail in the future. + * + * 2) This uses a newer standard that not all cursor themes support. + * + * If the requested shape is not available, this function emits a @ref + * GLFW_CURSOR_UNAVAILABLE error and returns `NULL`. + * + * @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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM, @ref GLFW_CURSOR_UNAVAILABLE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_standard + * @sa @ref glfwCreateCursor + * + * @since Added in version 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. + * + * If the specified cursor is current for any window, that window will be + * reverted to the default cursor. This does not affect the cursor mode. + * + * @param[in] cursor The cursor object to destroy. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @reentrancy This function must not be called from a callback. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * @sa @ref glfwCreateCursor + * + * @since Added in version 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 + * content 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_object + * + * @since Added in version 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 with associated key tokens. 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int key, int scancode, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWkeyfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_key + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun callback); + +/*! @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 macOS or Alt key + * on Windows. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun callback); + +/*! @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] callback 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](@ref error_handling) occurred. + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, unsigned int codepoint, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcharmodsfun). + * + * @deprecated Scheduled for removal in version 4.0. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_char + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int button, int action, int mods) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWmousebuttonfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref input_mouse_button + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter and return value. + * + * @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun callback); + +/*! @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 + * content area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xpos, double ypos); + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorposfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * + * @since Added in version 3.0. Replaces `glfwSetMousePosCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun callback); + +/*! @brief Sets the cursor enter/leave callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the content area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int entered) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWcursorenterfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_enter + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun callback); + +/*! @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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, double xoffset, double yoffset) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWscrollfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref scrolling + * + * @since Added in version 3.0. Replaces `glfwSetMouseWheelCallback`. + * + * @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun callback); + +/*! @brief Sets the path drop callback. + * + * This function sets the path drop callback of the specified window, which is + * called when one or more dragged paths 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] callback 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). + * + * @callback_signature + * @code + * void function_name(GLFWwindow* window, int path_count, const char* paths[]) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWdropfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref path_drop + * + * @since Added in version 3.1. + * + * @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun callback); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * There is no need to call this function before other functions that accept + * a joystick ID, as they all check for presence before performing any other + * work. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick + * + * @since Added in version 3.0. Replaces `glfwGetJoystickParam`. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int jid); + +/*! @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. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid 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 the joystick is not present or an error + * occurred. + * @return An array of axis values, or `NULL` if the joystick is not present or + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int jid, 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`. + * + * For backward compatibility with earlier versions that did not have @ref + * glfwGetJoystickHats, the button array also includes all hats, each + * represented as four buttons. The hats are in the same order as returned by + * __glfwGetJoystickHats__ and are in the order _up_, _right_, _down_ and + * _left_. To disable these extra buttons, set the @ref + * GLFW_JOYSTICK_HAT_BUTTONS init hint before initialization. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid 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 the joystick is not present or an error + * occurred. + * @return An array of button states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int jid, int* count); + +/*! @brief Returns the state of all hats of the specified joystick. + * + * This function returns the state of all hats of the specified joystick. + * Each element in the array is one of the following values: + * + * Name | Value + * ---- | ----- + * `GLFW_HAT_CENTERED` | 0 + * `GLFW_HAT_UP` | 1 + * `GLFW_HAT_RIGHT` | 2 + * `GLFW_HAT_DOWN` | 4 + * `GLFW_HAT_LEFT` | 8 + * `GLFW_HAT_RIGHT_UP` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_UP` + * `GLFW_HAT_RIGHT_DOWN` | `GLFW_HAT_RIGHT` \| `GLFW_HAT_DOWN` + * `GLFW_HAT_LEFT_UP` | `GLFW_HAT_LEFT` \| `GLFW_HAT_UP` + * `GLFW_HAT_LEFT_DOWN` | `GLFW_HAT_LEFT` \| `GLFW_HAT_DOWN` + * + * The diagonal directions are bitwise combinations of the primary (up, right, + * down and left) directions and you can test for these individually by ANDing + * it with the corresponding direction. + * + * @code + * if (hats[2] & GLFW_HAT_RIGHT) + * { + * // State of hat 2 could be right-up, right or right-down + * } + * @endcode + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of hat states in the returned + * array. This is set to zero if the joystick is not present or an error + * occurred. + * @return An array of hat states, or `NULL` if the joystick is not present + * or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_hat + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickHats(int jid, 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. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int jid); + +/*! @brief Returns the SDL compatible GUID of the specified joystick. + * + * This function returns the SDL compatible GUID, as a UTF-8 encoded + * hexadecimal string, of the specified joystick. The returned string is + * allocated and freed by GLFW. You should not free it yourself. + * + * The GUID is what connects a joystick to a gamepad mapping. A connected + * joystick will always have a GUID even if there is no gamepad mapping + * assigned to it. + * + * If the specified joystick is not present this function will return `NULL` + * but will not generate an error. This can be used instead of first calling + * @ref glfwJoystickPresent. + * + * The GUID uses the format introduced in SDL 2.0.5. This GUID tries to + * uniquely identify the make and model of a joystick but does not identify + * a specific unit, e.g. all wired Xbox 360 controllers will have the same + * GUID on that platform. The GUID for a unit may vary between platforms + * depending on what hardware information the platform specific APIs provide. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded GUID of the joystick, or `NULL` if the joystick + * is not present or an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + * @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 or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickGUID(int jid); + +/*! @brief Sets the user pointer of the specified joystick. + * + * This function sets the user-defined pointer of the specified joystick. The + * current value is retained until the joystick is disconnected. The initial + * value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to set. + * @param[in] pointer The new value. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwGetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void glfwSetJoystickUserPointer(int jid, void* pointer); + +/*! @brief Returns the user pointer of the specified joystick. + * + * This function returns the current value of the user-defined pointer of the + * specified joystick. The initial value is `NULL`. + * + * This function may be called from the joystick callback, even for a joystick + * that is being disconnected. + * + * @param[in] jid The joystick whose pointer to return. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @sa @ref joystick_userptr + * @sa @ref glfwSetJoystickUserPointer + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI void* glfwGetJoystickUserPointer(int jid); + +/*! @brief Returns whether the specified joystick has a gamepad mapping. + * + * This function returns whether the specified joystick is both present and has + * a gamepad mapping. + * + * If the specified joystick is present but does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check if a joystick is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return `GLFW_TRUE` if a joystick is both present and has a gamepad mapping, + * or `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwGetGamepadState + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwJoystickIsGamepad(int jid); + +/*! @brief Sets the joystick configuration callback. + * + * This function sets the joystick configuration callback, or removes the + * currently set callback. This is called when a joystick is connected to or + * disconnected from the system. + * + * For joystick connection and disconnection events to be delivered on all + * platforms, you need to call one of the [event processing](@ref events) + * functions. Joystick disconnection may also be detected and the callback + * called by joystick functions. The function will then return whatever it + * returns if the joystick is not present. + * + * @param[in] callback 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). + * + * @callback_signature + * @code + * void function_name(int jid, int event) + * @endcode + * For more information about the callback parameters, see the + * [function pointer type](@ref GLFWjoystickfun). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref joystick_event + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun callback); + +/*! @brief Adds the specified SDL_GameControllerDB gamepad mappings. + * + * This function parses the specified ASCII encoded string and updates the + * internal list with any gamepad mappings it finds. This string may + * contain either a single gamepad mapping or many mappings separated by + * newlines. The parser supports the full format of the `gamecontrollerdb.txt` + * source file including empty lines and comments. + * + * See @ref gamepad_mapping for a description of the format. + * + * If there is already a gamepad mapping for a given GUID in the internal list, + * it will be replaced by the one passed to this function. If the library is + * terminated and re-initialized the internal list will revert to the built-in + * default. + * + * @param[in] string The string containing the gamepad mappings. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * @sa @ref glfwGetGamepadName + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwUpdateGamepadMappings(const char* string); + +/*! @brief Returns the human-readable gamepad name for the specified joystick. + * + * This function returns the human-readable name of the gamepad from the + * gamepad mapping assigned to the specified joystick. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `NULL` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the gamepad, or `NULL` if the + * joystick is not present, does not have a mapping or an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref GLFW_INVALID_ENUM. + * + * @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, the gamepad mappings are updated or the library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetGamepadName(int jid); + +/*! @brief Retrieves the state of the specified joystick remapped as a gamepad. + * + * This function retrieves the state of the specified joystick remapped to + * an Xbox-like gamepad. + * + * If the specified joystick is not present or does not have a gamepad mapping + * this function will return `GLFW_FALSE` but will not generate an error. Call + * @ref glfwJoystickPresent to check whether it is present regardless of + * whether it has a mapping. + * + * The Guide button may not be available for input as it is often hooked by the + * system or the Steam client. + * + * Not all devices have all the buttons or axes provided by @ref + * GLFWgamepadstate. Unavailable buttons and axes will always report + * `GLFW_RELEASE` and 0.0 respectively. + * + * @param[in] jid The [joystick](@ref joysticks) to query. + * @param[out] state The gamepad input state of the joystick. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if no joystick is + * connected, it has no gamepad mapping or an [error](@ref error_handling) + * occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_ENUM. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref gamepad + * @sa @ref glfwUpdateGamepadMappings + * @sa @ref glfwJoystickIsGamepad + * + * @since Added in version 3.3. + * + * @ingroup input + */ +GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwGetClipboardString + * + * @since Added in version 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. If the clipboard is empty or + * if its contents cannot be converted, `NULL` is returned and a @ref + * GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @param[in] window Deprecated. Any valid window or `NULL`. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_FORMAT_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @win32 The clipboard on Windows has a single global lock for reading and + * writing. GLFW tries to acquire it a few times, which is almost always enough. If it + * cannot acquire the lock then this function emits @ref GLFW_PLATFORM_ERROR and returns. + * It is safe to try this multiple times. + * + * @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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa @ref glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the GLFW time. + * + * This function returns the current GLFW time, in seconds. Unless the time + * has been set using @ref glfwSetTime it measures time elapsed since GLFW was + * initialized. + * + * This function and @ref glfwSetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * 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 operating system. + * + * @return The current time, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwSetTime. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW time. + * + * This function sets the current GLFW time, in seconds. The value must be + * a positive finite number less than or equal to 18446744073.0, which is + * approximately 584.5 years. + * + * This function and @ref glfwGetTime are helper functions on top of @ref + * glfwGetTimerFrequency and @ref glfwGetTimerValue. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of GLFW time 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. + * + * @thread_safety This function may be called from any thread. Reading and + * writing of the internal base time is not atomic, so it needs to be + * externally synchronized with calls to @ref glfwGetTime. + * + * @sa @ref time + * + * @since Added in version 2.2. + * + * @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + * This function returns the current value of the raw timer, measured in + * 1 / frequency seconds. To get the frequency, call @ref + * glfwGetTimerFrequency. + * + * @return The value of the timer, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerFrequency + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + * This function returns the frequency, in Hz, of the raw timer. + * + * @return The frequency of the timer, in Hz, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref time + * @sa @ref glfwGetTimerValue + * + * @since Added in version 3.2. + * + * @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @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. It can also detach the current context from + * the calling thread without making a new one current by passing in `NULL`. + * + * A context must only be made current on a single thread at a time and each + * thread can have only a single current context at a time. Making a context + * current detaches any previously current context on the calling thread. + * + * When moving a context between threads, you must detach it (make it + * non-current) on the old thread before making it current on the new one. + * + * 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 GLFW_CONTEXT_RELEASE_BEHAVIOR_hint) + * hint. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * @param[in] window The window whose context to make current, or `NULL` to + * detach the current context. + * + * @remarks If the previously current context was created via a different + * context creation API than the one passed to this function, GLFW will still + * detach the previous one from its API before making the new one current. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwGetCurrentContext + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_current + * @sa @ref glfwMakeContextCurrent + * + * @since Added in version 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 when + * rendering with OpenGL or OpenGL ES. If the swap interval is greater than + * zero, the GPU driver waits the specified number of screen updates before + * swapping the buffers. + * + * The specified window must have an OpenGL or OpenGL ES context. Specifying + * a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + * error. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see `vkQueuePresentKHR` instead. + * + * @param[in] window The window whose buffers to swap. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark __EGL:__ The context of the specified window must be current on the + * calling thread. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapInterval + * + * @since Added in version 1.0. + * @glfw3 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 OpenGL or OpenGL ES + * 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_. + * + * A context that supports either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accepts _negative_ swap + * intervals, which allows the driver to swap immediately even if a frame + * arrives a little bit late. You can check for these extensions with @ref + * glfwExtensionSupported. + * + * 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. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see the present mode of your swapchain instead. + * + * @param[in] interval The minimum number of screen updates to wait for + * until the buffers are swapped by @ref glfwSwapBuffers. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark This function is not called during context creation, leaving the + * swap interval set to whatever is the default for that API. 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. + * + * @remark 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. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref buffer_swap + * @sa @ref glfwSwapBuffers + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + * This function returns whether the specified + * [API extension](@ref context_glext) is supported by the current OpenGL or + * OpenGL ES context. It searches both for client API extension and 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. + * + * This function does not apply to Vulkan. If you are using Vulkan, see @ref + * glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + * and `vkEnumerateDeviceExtensionProperties` instead. + * + * @param[in] extension The ASCII encoded name of the extension. + * @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + * GLFW_PLATFORM_ERROR. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwGetProcAddress + * + * @since Added in version 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 OpenGL or OpenGL ES + * [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. + * + * This function does not apply to Vulkan. If you are rendering with Vulkan, + * see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + * `vkGetDeviceProcAddr` instead. + * + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + * @remark The address of a given function is not guaranteed to be the same + * between contexts. + * + * @remark 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 first. + * + * @pointer_lifetime The returned function pointer is valid until the context + * is destroyed or the library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref context_glext + * @sa @ref glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader and an ICD have been found. + * + * This function returns whether the Vulkan loader and any minimally functional + * ICD have been found. + * + * The availability of a Vulkan loader and even an ICD does not by itself guarantee that + * surface creation or even instance creation is possible. Call @ref + * glfwGetRequiredInstanceExtensions to check whether the extensions necessary for Vulkan + * surface creation are available and @ref glfwGetPhysicalDevicePresentationSupport to + * check whether a queue family of a physical device supports image presentation. + * + * @return `GLFW_TRUE` if Vulkan is minimally available, or `GLFW_FALSE` + * otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_support + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + * This function returns an array of names of Vulkan instance extensions required + * by GLFW for creating Vulkan surfaces for GLFW windows. If successful, the + * list will always contain `VK_KHR_surface`, so if you don't require any + * additional extensions you can pass this list directly to the + * `VkInstanceCreateInfo` struct. + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * If Vulkan is available but no set of extensions allowing window surface + * creation was found, this function returns `NULL`. You may still use Vulkan + * for off-screen rendering and compute work. + * + * @param[out] count Where to store the number of extensions in the returned + * array. This is set to zero if an error occurred. + * @return An array of ASCII encoded extension names, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @remark Additional extensions may be required by future versions of GLFW. + * You should check if any extensions you wish to enable are already in the + * returned array, as it is an error to specify an extension more than once in + * the `VkInstanceCreateInfo` struct. + * + * @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 + * library is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_ext + * @sa @ref glfwCreateWindowSurface + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + * This function returns the address of the specified Vulkan core or extension + * function for the specified instance. If instance is set to `NULL` it can + * return any function exported from the Vulkan loader, including at least the + * following functions: + * + * - `vkEnumerateInstanceExtensionProperties` + * - `vkEnumerateInstanceLayerProperties` + * - `vkCreateInstance` + * - `vkGetInstanceProcAddr` + * + * If Vulkan is not available on the machine, this function returns `NULL` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available. + * + * This function is equivalent to calling `vkGetInstanceProcAddr` with + * a platform-specific query of the Vulkan loader as a fallback. + * + * @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + * functions related to instance creation. + * @param[in] procname The ASCII encoded name of the function. + * @return The address of the function, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_API_UNAVAILABLE. + * + * @pointer_lifetime The returned function pointer is valid until the library + * is terminated. + * + * @thread_safety This function may be called from any thread. + * + * @sa @ref vulkan_proc + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + * This function returns whether the specified queue family of the specified + * physical device supports presentation to the platform GLFW was built for. + * + * If Vulkan or the required window surface creation instance extensions are + * not available on the machine, or if the specified instance was not created + * with the required extensions, this function returns `GLFW_FALSE` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported + * to check whether Vulkan is at least minimally available and @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * @param[in] instance The instance that the physical device belongs to. + * @param[in] device The physical device that the queue family belongs to. + * @param[in] queuefamily The index of the queue family to query. + * @return `GLFW_TRUE` if the queue family supports presentation, or + * `GLFW_FALSE` otherwise. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @remark @macos This function currently always returns `GLFW_TRUE`, as the + * `VK_MVK_macos_surface` and `VK_EXT_metal_surface` extensions do not provide + * a `vkGetPhysicalDevice*PresentationSupport` type function. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_present + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + * This function creates a Vulkan surface for the specified window. + * + * If the Vulkan loader or at least one minimally functional ICD were not found, + * this function returns `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref + * GLFW_API_UNAVAILABLE error. Call @ref glfwVulkanSupported to check whether + * Vulkan is at least minimally available. + * + * If the required window surface creation instance extensions are not + * available or if the specified instance was not created with these extensions + * enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + * generates a @ref GLFW_API_UNAVAILABLE error. Call @ref + * glfwGetRequiredInstanceExtensions to check what instance extensions are + * required. + * + * The window surface cannot be shared with another API so the window must + * have been created with the [client api hint](@ref GLFW_CLIENT_API_attrib) + * set to `GLFW_NO_API` otherwise it generates a @ref GLFW_INVALID_VALUE error + * and returns `VK_ERROR_NATIVE_WINDOW_IN_USE_KHR`. + * + * The window surface must be destroyed before the specified Vulkan instance. + * It is the responsibility of the caller to destroy the window surface. GLFW + * does not destroy it for you. Call `vkDestroySurfaceKHR` to destroy the + * surface. + * + * @param[in] instance The Vulkan instance to create the surface in. + * @param[in] window The window to create the surface for. + * @param[in] allocator The allocator to use, or `NULL` to use the default + * allocator. + * @param[out] surface Where to store the handle of the surface. This is set + * to `VK_NULL_HANDLE` if an error occurred. + * @return `VK_SUCCESS` if successful, or a Vulkan error code if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_API_UNAVAILABLE, @ref GLFW_PLATFORM_ERROR and @ref GLFW_INVALID_VALUE + * + * @remark If an error occurs before the creation call is made, GLFW returns + * the Vulkan error code most appropriate for the error. Appropriate use of + * @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + * eliminate almost all occurrences of these errors. + * + * @remark @macos GLFW prefers the `VK_EXT_metal_surface` extension, with the + * `VK_MVK_macos_surface` extension as a fallback. The name of the selected + * extension, if any, is included in the array returned by @ref + * glfwGetRequiredInstanceExtensions. + * + * @remark @macos This function creates and sets a `CAMetalLayer` instance for + * the window content view, which is required for MoltenVK to function. + * + * @remark @x11 By default GLFW prefers the `VK_KHR_xcb_surface` extension, + * with the `VK_KHR_xlib_surface` extension as a fallback. You can make + * `VK_KHR_xlib_surface` the preferred extension by setting the + * [GLFW_X11_XCB_VULKAN_SURFACE](@ref GLFW_X11_XCB_VULKAN_SURFACE_hint) init + * hint. The name of the selected extension, if any, is included in the array + * returned by @ref glfwGetRequiredInstanceExtensions. + * + * @thread_safety This function may be called from any thread. For + * synchronization details of Vulkan objects, see the Vulkan specification. + * + * @sa @ref vulkan_surface + * @sa @ref glfwGetRequiredInstanceExtensions + * + * @since Added in version 3.2. + * + * @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * 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 + +/* Some OpenGL related headers need GLAPIENTRY, but it is unconditionally + * defined by some gl.h variants (OpenBSD) so define it after if needed. + */ +#ifndef GLAPIENTRY + #define GLAPIENTRY APIENTRY + #define GLFW_GLAPIENTRY_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/vendor/include/GLFW/glfw3native.h b/vendor/include/GLFW/glfw3native.h new file mode 100644 index 0000000..92f0d32 --- /dev/null +++ b/vendor/include/GLFW/glfw3native.h @@ -0,0 +1,663 @@ +/************************************************************************* + * GLFW 3.4 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2018 Camilla Löwy + * + * 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 + *************************************************************************/ + +/*! @file glfw3native.h + * @brief The header of the native access functions. + * + * This is the header file of the native access functions. See @ref native for + * more information. + */ +/*! @defgroup native Native access + * @brief Functions related to accessing native handles. + * + * **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 may define zero or more + * window system API macro and zero or more context creation API macros. + * + * The chosen backends must match those the library was compiled for. Failure + * to do this will cause a link-time error. + * + * The available window API macros are: + * * `GLFW_EXPOSE_NATIVE_WIN32` + * * `GLFW_EXPOSE_NATIVE_COCOA` + * * `GLFW_EXPOSE_NATIVE_X11` + * * `GLFW_EXPOSE_NATIVE_WAYLAND` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * * `GLFW_EXPOSE_NATIVE_OSMESA` + * + * 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. + * + * If you do not want the platform-specific headers to be included, define + * `GLFW_NATIVE_INCLUDE_NONE` before including the @ref glfw3native.h header. + * + * @code + * #define GLFW_EXPOSE_NATIVE_WIN32 + * #define GLFW_EXPOSE_NATIVE_WGL + * #define GLFW_NATIVE_INCLUDE_NONE + * #include + * @endcode + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if !defined(GLFW_NATIVE_INCLUDE_NONE) + + #if defined(GLFW_EXPOSE_NATIVE_WIN32) || defined(GLFW_EXPOSE_NATIVE_WGL) + /* This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + * example to allow applications to correctly declare a GL_KHR_debug callback) + * but windows.h assumes no one will define APIENTRY before it does + */ + #if defined(GLFW_APIENTRY_DEFINED) + #undef APIENTRY + #undef GLFW_APIENTRY_DEFINED + #endif + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_COCOA) || defined(GLFW_EXPOSE_NATIVE_NSGL) + #if defined(__OBJC__) + #import + #else + #include + #include + #endif + #endif + + #if defined(GLFW_EXPOSE_NATIVE_X11) || defined(GLFW_EXPOSE_NATIVE_GLX) + #include + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include + #endif + + #if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ + #endif + #if defined(GLFW_EXPOSE_NATIVE_GLX) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, glx.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_EGL) + #include + #endif + #if defined(GLFW_EXPOSE_NATIVE_OSMESA) + /* This is a workaround for the fact that glfw3.h defines GLAPIENTRY because by + * default it also acts as an OpenGL header + * However, osmesa.h will include gl.h, which will define it unconditionally + */ + #if defined(GLFW_GLAPIENTRY_DEFINED) + #undef GLAPIENTRY + #undef GLFW_GLAPIENTRY_DEFINED + #endif + #include + #endif + +#endif /*GLFW_NATIVE_INCLUDE_NONE*/ + + +/************************************************************************* + * 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. + * + * @remark The `HDC` associated with the window can be queried with the + * [GetDC](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getdc) + * function. + * @code + * HDC dc = GetDC(glfwGetWin32Window(window)); + * @endcode + * This DC is private and does not need to be released. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); + +/*! @brief Returns the `NSView` of the specified window. + * + * @return The `NSView` of the specified window, or `nil` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.4. + * + * @ingroup native + */ +GLFWAPI id glfwGetCocoaView(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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); + +/*! @brief Sets the current primary selection to the specified string. + * + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified string is copied before this function + * returns. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwGetX11SelectionString + * @sa glfwSetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI void glfwSetX11SelectionString(const char* string); + +/*! @brief Returns the contents of the current primary selection as a string. + * + * If the selection is empty or if its contents cannot be converted, `NULL` + * is returned and a @ref GLFW_FORMAT_UNAVAILABLE error is generated. + * + * @return The contents of the selection as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_PLATFORM_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + * @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 + * glfwGetX11SelectionString or @ref glfwSetX11SelectionString, or until the + * library is terminated. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref clipboard + * @sa glfwSetX11SelectionString + * @sa glfwGetClipboardString + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI const char* glfwGetX11SelectionString(void); +#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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + * @return The `GLXWindow` of the specified window, or `None` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + * @return The `struct wl_display*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + * @return The `struct wl_output*` of the specified monitor, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + * @return The main `struct wl_surface*` of the specified window, or `NULL` if + * an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_UNAVAILABLE. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark Because EGL is initialized on demand, this function will return + * `EGL_NO_DISPLAY` until the first context has been created via EGL. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 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. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.0. + * + * @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_OSMESA) +/*! @brief Retrieves the color buffer associated with the specified window. + * + * @param[in] window The window whose color buffer to retrieve. + * @param[out] width Where to store the width of the color buffer, or `NULL`. + * @param[out] height Where to store the height of the color buffer, or `NULL`. + * @param[out] format Where to store the OSMesa pixel format of the color + * buffer, or `NULL`. + * @param[out] buffer Where to store the address of the color buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaColorBuffer(GLFWwindow* window, int* width, int* height, int* format, void** buffer); + +/*! @brief Retrieves the depth buffer associated with the specified window. + * + * @param[in] window The window whose depth buffer to retrieve. + * @param[out] width Where to store the width of the depth buffer, or `NULL`. + * @param[out] height Where to store the height of the depth buffer, or `NULL`. + * @param[out] bytesPerValue Where to store the number of bytes per depth + * buffer element, or `NULL`. + * @param[out] buffer Where to store the address of the depth buffer, or + * `NULL`. + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI int glfwGetOSMesaDepthBuffer(GLFWwindow* window, int* width, int* height, int* bytesPerValue, void** buffer); + +/*! @brief Returns the `OSMesaContext` of the specified window. + * + * @return The `OSMesaContext` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_NO_WINDOW_CONTEXT. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.3. + * + * @ingroup native + */ +GLFWAPI OSMesaContext glfwGetOSMesaContext(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/vendor/lib-vc2022/glfw3.dll b/vendor/lib-vc2022/glfw3.dll new file mode 100644 index 0000000000000000000000000000000000000000..0511a9a8ccceb09b00c4521458dcb0f6687f2c36 GIT binary patch literal 232448 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 literal 0 HcmV?d00001 diff --git a/vendor/lib-vc2022/glfw3.lib b/vendor/lib-vc2022/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..92de42955df6d8570924258acfa3836893afd931 GIT binary patch literal 706276 zcmeFaNpmDgmY9jk%B*QtvzD&P67tv-DV_<(4iU0p`@T&?E;T360XQPO5`d%Kfr!W! zA%6fVyi$aJfCnBaJoSkpoZk-`t<43 zxBioVK3`wI{fnRevp*kx%})2vPWSgu_RojU_xnGO4`(N*^7nuF)4jb<|I6Nw{=-%s1{oYSrzF%4Y>;@^GYHY?LA3%bVpI;}4G=<<4X zw_0x==hq9{DrSOhku^~+oB6MT%lqfMr{!jT|9I!LOT5evqAsZYAtH7rns`kYm0e!O zrr!-ir1OWT_3F;{oOo@TMs1d;0g9d@tnuvD~$j5);Y)o<;q+fUL1FK^Cz(^ z7sn5)r;Fp|!}4i4zgzy*;>OOS^9sKWBBpKo87$M~<9cTSKcdfq%eSh5czFKO$f4srz}chPWCi_L+Ym>ps4C2`t?rP_JhBfOt~ zv$#0!SAbuhow>zc>Bn)ED)QZiRD-=ZzIndC|5m=j_L+DwBoTEWkxB+hyvdbr*Nd_%zoG zh<@=7$S4GC#lS6S?iEcCW`3T0pW()@Eo1=$OWQny0guqlW&v6@aOLYKK}w9-Lb9F9 zB8iGh@`>$LQR`{f+^Q`Kv#46eO^AzukM(!?X-mysy3@*vj@L? z_~v2t{=p(tZh2lHn1luF#2FIQmEvmKqqWH0S(eE6s=6yfPL{FJehf17!l;VFic_-3 zZM0s#Td;CBtHq{g8k^_G$JH7%w~uDD9HUv1`Bj#iKEHSi9&UEQ=Z}vNu?v}ZQSOJu z^m^(k4$qTFoKSV+7l}Mi1ctuvXj2cW?TVr@qjh!O+uN z3t4+f=(k-tI?cs{qMOazxj2O`j^7)=IQFWv_WcgN*Ds1ht!N5{4Fg*0^|`j79o!^K zyEHYOY6cL$zBpbl{_=UTk^AK8nf3fSHIRw#wHbrW5_#AN+-k_4`47P@V8f!cbzNqL z-hGL}_wzNIY%9e!h83P8tm7ib@0 z?DfV4{2nq}7_&L(t`aBl#|Dbr%yzu8YYSwXMOoYl!DtNfZgu_5#qpcF)z$p&;`r^{ zjy3i=j>J689Gs3J=YGE74Q`*Am-_JEki9npcsZM_gvcW@%aedj1}{*o7>TILhN`$orL$aTMHxJrcvpOS_`UbAFlVQ_pg{ z&&sQcCXUOPyWH4lHQ9ajeD}>9Lb9W6yd?FJS;MJKwR+$<7m}l-Jqw7m(FR2mRz5oy zmeIZacC);mbHRPLyk5vrblhH%It@&edSMz>K_X<;v0={dARahTPd*l~^}00n!yqgy zpq|U}K`h=iK=;edMxKQRu=Db`3ELWJzUM<*9B6i41YMbjMebev*7sBKUnTxa#D8Dw z7tI3B)F`RL7MXXfp?G#F{>#OGq4=*A|25_ft(ON)6$WiM`GP|Mu`doEgzr1=@K&BE z;*^npAMGE@LqW25{=c0T3-EVgIu6Q4SdBSek$>f4={_0QGYoc77;`gyba)M^2~ zSkE6&f{2@t113~Eny;!W{nm$aGTlnN`jFGNKO*C_Y7k7`Eu!V-@oxU@#HT!F&O0A! z7CrnRv15JB6?^z$x%l>Vf8Gv181B4&(=oKw!)qmY51YS2h+D1~H+jErtcqgTPIuOz zMHzm=U(87g2oFy*yBqynPG)x+3b;iVwS3w_n)+x5)9Ufoo3iDN=yizOoRfcfE8aSM zUe7-)?-fFaA9Sm`yZ9aS;4Ur$c#7{IpT3o!@G`yXujcRT)$?XiuN>qqZrm11Kvn}l zC&QarhCzeP(`vmt^4A|DLh+#_!Wvo2d6{`WM45R!Y&snM@H74bG5+R}TktDEI%6M4 zi|f@I?(9yOz7%YN{^begI|eA0W$by)YJrXMkHB*`-)x@Vu2;`*-j21|r6Dt#9fSbS z1Ya#S%fAx$rm@!v0;?dC0WFv}ZjqmP{>AcX_`0`pw-3qe>-q9Yk=Yl^`^Da zXHaUmlA#UIt)6Gd4{YF__KN(MBcJFEunY6maw9HR>Rnp;7bLH`GU9*eMS)+I30esw z{=-V)4TxR(klRP_FS0sG3xxG_J%4<=yylX5FRuuU#Pu5*&I) z79N=Bd4BiRa^VQ%rPsy?qj`ePflJ}D6!(xYp5{V45m!^e)$IFgE-ZmBZg`$6WWHZ7 zg@7SchDvH&f9t}OT=D}S1^f2!rTVkiWH{X*S;T1^cZn;Srt|xIv^!wukxLSE1rAUz zBGdAl=?zdJ3x`cRA@pbA+h zXkSeqSpD0+v%!$9(4!v4YW)pj#eCTBR|5ZAEE^c}czEXA-SsbXAH%T3abZB54&Xpz z^X2hYYj;!oH}gmKjk)Fv3h2AlJN+>8lK_OV%;}|}o6{<)lBN?He#uGgs`fzb9(1^X~&gBbe7{j_uQ^e=r5I6GXWV*rL5#(9d1!&Zi z3Tl5}s97$Kjy6I{cYp7tb_*MNbsB|5QBK^n^o4LK?1#6`9X;|wRAO1#mEP&u$@$6R zbpQ1D^hk8JfAFF2NB^+>rCw3QL7L_h*Ja6&)CAF6e{inLxmVXg(zY?igfWIRfV^?6 zgWLtPsED!(y}rxf7Z1<(3n8aKVyw>flOz#4)WU1(5alSk8W*k1&Y5KYt9@eOOD`#l zF3;NuU4+xWn6L$`I2-dWOMKL_V>8vPSCRo2ZUc#a9)hb%pS?B;d95$$zh7~P+AgsK zRAEz~{bH`iYSo4_`^aCW`^GEcCTY_oH=F3|w~K{Uv^HK_#6_31k$1d*bbfSnd?Nlg zFW~4%qO^%Q>GhUMh2aCa;qp@4`0p+^PdCdI)->qx_Hy+oq~?vjryj~%t8;HX5Vuz6 z?-Q=E_8!|4r_{dkyV8jEN?iV)_1E3L*?Ip{-*(lNd4KsG8k-~OqNqzEbK`l*oE zzy1aW_`sh-$$!{{OCyW6+e(}%*gFuUx2|16Wvk!so)F>&qn}IKPy_lxD|Pi}F3gvY z?4t#z$Kr8*lYW^;3UH&)uMdKgs6cDl33Wx7Yy{JiznE1$>*Bfz@;dUO_xFjgC!3GX zld4RL0F%eV)6L!81;$uQEf8^~epnQI)1$jF*51PNK&pc5a4= zTy1*cxTyU)>ly?O)22VoY$N2eCJ&pA!EiPTw+h&G)a5?*1uGW?$YMnp@;VLz%QenI zX$G}#OS}r(XNTS1d-Zhp)nd(clmCT3K>l!R6^{W1qbgw6Fk40Qj4+%(&aaktSkM>F z`I&L@BvlyJi95i@r5xbH!2cujvaW2<6r;UeJiV3zb1jUf*Bj6SlI%cp4<=O=0eg<+ z$u~k|UTx@l^$<(bk#n93C8-~wn-WdMIEA+e7bVeH{%&7ecy)l9ED2N3zxh2fty+^; zkbC@LdklC^VArW*){qygZiBn$b+CBLN^Y-a={02xn`jzOHErnqZpjszi3u$Oo5BvH z_S!J*s))4@-_9T2^jGQ{e9hl1lI0!eT5L_ZLF-jnT?K7bPGFf$JMh~98(CK5X^~;j z8e`YW;egx9dfVL~1)oJ;l+AZ&W8W_B9)-@@%!(r|PV%H_i-{w`FnTm&E;`T{!+~@3 zu@hqbBp|mWpA)nbX1lRjT0OV4K;PT3wqDp|8NNXicMz+Sm-94$l^4}X#BNKy&091I zi{Z|%5bnaZ;2!4PyuY76F1J6%gMi(V=blBqWiF6K)1rOHHhd#_%h?bdn_%UKalq0j z-ZQ(Dz9RMw!u+1F0GK0ni^J`AR1FMHY*^jmXuCzrsf%wW&!uzu0dVwM;})h3%>08nfPxZ{<{Rbk)$qOe8?K|xrH34khuA+4IeiZiI1bTEA7Z&Y6joGo^3D#<_h$!Z ze4p}t!uK)XM|>ahZ48_<-Z0}0Gu|-c4YR`;-<;qFw|pLae{)uGSUw)CC zCF|Aw*IdGOw7QC`+mA#;0pPqvnn=ZlP%o7-WGwuV+&1D+^YYcv1|%MaJz z4hO0~{%U^r+>?i%gIG=pI)qTFgq!EPt>(Omi#v~Be|vwmx*Gyjc$%qCwWzd@e9;7c z7J6)j{=V&qan18x|B8VWXCJ#loPBD@!pLy;vmFsme$*4lEQowW8SLa%B%1|wkcC{- zJ$u~D!XS#%Hf+4#8}2;Aa391C#>-RtEXr^^tkH0tIM4F1OFH~j?R9$=`&hWTs`IQ$ zZ5Ag8uUQ(T45o`b>}eV;Y1~E(Iq@#eoQGA16K_^~f8{(wFWKRo=-K0LmSt&M7nsZK zQ8CN%tZJE@H?y#4<*-!ZRD1DT98XN&c@|`OiZ9QFGoTzVrZPcs@|RA-CJ!)l2A*}B zn-xL8^}0(vYb>5|-j{)&`kobvW<~4QmALF(oZAsjG&Rz_jRtYgm{4*Rn* zE$fWM_pDGn!!Vk69rwNqX9dclDw3e9JO_zo9U+&Z9lCHZQTb(voL_p*U@BapYV5{f z2k&2lohrdF8i%!a;VeH+Wij46iD!l7S=Cip9N}$d#n)LK*7%X3M73&+Sxqa>Uu@I1 zlR8gO2&bZN}o1)x3y z1~ASjg=uH-nPX`kJpWEZ>!9_topsR6HM0&rP?M3@lHSTX^06_pj(pbJ$3{Luk3I5q zhzDz6wM_^1Rr^?5m$uPwt*f>zT|35A`+R7f>hjjY1RGQv8>w1$QP5;CO$KE z)gg#{Jo0FOIpBxG9snq8I5yRhPmM`+)p&oMSUbJ1^BE6joR_(z9?xg%;a1SZ)G72BlckhmC* z2kjZOSe#wW^%cmmhuKlX`iyyK@U$nANxss5K3H@q4l9FOZ|NGm(ioh^pE|roaD=`C z=P8snGS>cPXWuD=XZx3tj^!hbdA!PzzLE-+^lNlM^MO;ZZj^XI*Hx8plvk~oU$l69 zdK<`KA#*ZgInJ`mN6sQ*NxqJTQX#h6FmH;iXxhp)9F5@OMQw?vC%OamMt$IJX`h13 z%R9fpcmQ{i0I~pQMm2#}BwRD(2 zcOB-%dYGZ&U7CkUh;xPp8>r=54`W)}1Zn2oEwB0)s}`;Rs_0LBtRz#hE#1G(#_S*V z_hI#yvwO4=T7MwbufvDVrqts4Vb!6N4N&_sN;9|9*ysLNLaE4mLrvRhM+g@xy~=z2 zd@XeU1_;%BkQQBwW2d(uK)?y7v~2>fjLW(a*AUta_K9sod|A^5Vbv6((bSfPH?>Vw zL|k%d1uGfl5TTccS(!R7>V)j`WL|}ZzO~Kpd#Up>sbL{tMaF?X z_R)NoA7=KVhOHuP@#{zlkrWMuyZ)QI(U{Q`u2dvNh30AJl~?nPy*k3bQi28Y1P>Mc zPQ@j5LpL+R2MHqT{Mx=0zaA9-SOVuLdhC=kua0W`}<;C`}lzXzq7;&pp-7#Y@T#r0~ip@v|r{z4+Cu_LTtmvMHPP>*nHEyx>?q z9stCCo_1NJ7r$SM-hFfsM#|d>aY~xn!H8bD_w#S>h(2)NTtj+EjKWx8+Q;1?zBCJs zX~Z2j3^mWITu`dNeuJSL*GCNUA}(l2Cg5qKi5;{IL;T-W)npz(5?uF;SFI8pCTml`f{#9r(HW6LRMW8m=U&fyEZ6sn%<1yGb!b46>{#d)ZSzRQKc}2vDQlJzX z!H+tZucc{{xMKt@JKh+hSc$VkBo|!_==Br6n$p?u;RbWD2-UN$gccAUT^EF$#D@R4 zq^1H!d+)Ey@)a z50pD%d4&C6d#>K7U<}sNvL5uJDV74P1&Z2_ZyhdTjZmEBtLL?odLqWV)-U1=?Xc(5 z0~q2o5$xV2AQM1r)`P&-B&cBqxQ}9~RN)tjbA0jb6~=zeE+ zO&Q8V+jiG2KVX#pXm=H1r9Ouf^0}QI^4Vx_4uizC8nbp9`KZTxqLGf#{ZXh_LhNI< z22m__hTy+U@**RWRdo6MfZyBd%>!x}Hm(d4CtkPTsE!LAaadRt;#7pl_CxLEsL`>S z{^+KSaOBM~38^8f+$duA$N*1R!Yw}5BA^?`4NEbVhwYt$+@C{lNXUd%F`bY2t(EqPAlD8!vb=_2g4rUOfiQiSC5ivLsikShbY^N!k& zlAy{1JZ>7p1VGV7I%ujP#KxSt6UrDPA}N5LZ>~i?AXBD7S}7u=w&` zxNfV!28A9wU{s#it&q+~x>d7OzDs7d15nnX6>c-Ty^0X7>0WV(=)xk5W3Ccb7vybX8*g{e$G2HI#~Pj45(>C}7~518JaRQ(V^`N9=O z{^WP#0b@TFzscBr_vi3!+b*Z(Z@uYoq1-ZOIiINWF}z!C7Q!OMF~0kuIDC5>)6R#{ zT%d91u~e(?JnaocJI}TDeD?zt$FcJq_4Cd%VO5Y!B9!VzH8J@hTHMY_U8SC6Y^6>A z7*bpH;ehgqW3ZHeqlDSUT+gZ0yOc^rH|o~5A|ZZ560j5N}XWiAHIGo?syV6!$}z0F&&5}6EEQtWw0B* z!%~}h$u_mozX)%}4Nihu8{O8Qy?IVOmF>kw-TG4rD$YZ9cG`S{!#UoebwF0QKB)i0 z_0?`_5w88XUuP}npKgX&w%abjAGK*iUMSj$JYP}^G}^G`W`>q-_gGG10Z7q#*XI#GFB*5&`%Yj>ZjYftmuztiPPf`|aB~3*&}BVaZ8+f~P8U zq(Z$Z4^45Ax+TBkvs9G=VU##_sHC^Z;+8Ns38+Yzs> zevg~0$frWz781|;CS#6u4Ee-5@<|hs3GIiPT$mJBK=QDJVt%*yQ6eP?6%G>>$dO&h z>3u7dWNykhl25*6R0J*Nj0=s^csm=9Vze;sg!9?NM2tj zaUx710E-@XlGZXSc7W*-MQU4+g@@2WMLAl}D+0{f%vXX9urS=9uiws>7BC^Wx+Vs&AvjhdsgB}ow=qLS2VD$H3pY|jPBbVPDX zslRdH-uHS?v6AyUB<&mP%u8G@M#n0Nh|#f&@!d4eCeEuasTl7&MdIf=9ztppkZ#rM zUM)7r@x2rvKN9FrpQ-zR(JJ&0g`DNy2ej&-7o#;N)W<3IUnyPC<9B-V>4vX30Yqv6 z{Vu~*)vMG%jK`W$T2x*apmB<^%b1&`Hp^Wc=aIPpyVrgE7kuKSgngT+6T(XN$+9Qo za!9s^u|hbz^mYqnH#cjFtpbHA*L^^@*VJ}v_9yxxiQm^U^QAV!=qYdi-3Ko?;+bx- zJMYX3P|L+wNA0}dsDud8CNQEGX?=XU@y0QD>f5^s6nec)?*VmsD{>dz_F3+HkvB@Z z5c%Rr>93CRslI$Et<~EV*I?tWq%a^N<1m1lr#-ars@i#_<7(wxPX~R-NRj@D+8I5f zQK>(npw}pt?-t1l^n)J8y~=ETBtk*99%&*r!ajuEzewLN?2~QL-G1_Q@7A^TcDq;B zC{xzo>WTK7%b-kynFk7xJA<61{8;~CrpyC9WlnwfZrDF|huh2k2VIz>KqWeXz@z5E zh9exo=o8#x2>W_`wqEi_1UunhN9?C~zu7Ct2_cLfa)l?ehuG&?m6Jt{=Wm{g8?w)9 zjAUKdHs0Oh_Q^Up9XC-C;QC(6=ax^N;Mh|&5y1jCoMpH6h&YMcpsWk*No$dXz=0qa zYS4+)8S(?$#R*<&U0fl?+&pr}vd7eEQXy!!P00rm#*FqXM7&Fg{rB{~Hy@qXLNQ$9 zDJF(RsJMd^;yOKyB!mDEB%&kZ_iy%Pto2OmsFdc)yf7e`JtDp~OX9=;9UjeOQcDzD zT302&93YYII7&+-djq6EU1f^&oXLvd|U4S`2q_iwagA=k~8tCkHU*(3oB}mSG4S*7o=a9(Uz|4;O zVa?9m@mUxGtVwUrtprno?&x+tQ=>YiM5O&102L+C%p}t=KxfAXYE%UASr}(ZB9yz0 zk!5f()IFUY_9+X_6*2XIgPyvAkfDmKhZ^Ycgt$WS<@VzuF9^M=jH`~Y9Rswu?R#=* zXd9@l8eime)IH6w6%a}GCa{MlyukrWBxTe5)peYDzRGmh|*y?^k#fh=Yl=$~gGyIi2t&TAoa9Tx_y!MFc*An*r+QGMimb5INa^ z)0DWg!g6v${_LH7DMH0&=a9yX_6GSr>h=mBEng<-vw$T zZm3wT^yqGH)lqvSqMq%S(~-EmCmHdbmh=`q13%e6p4b>75e(_O^1>b&n)HTAMcpX@ zR3^CcHFin{s6P(-5jw-e1nZL~u14*q=QKZ5XT@xOs}EiQHv}q)lp_m;0n!*(9LZo} z2-Faz8Q~6~dt%>8b~ig!KgWg_cTqrkBa4W$eU2LO` zl3J*MBg=|3jh{_Y9@a>drv#eXeXF^D&oBEKxyTbhC6WE9?a6Gxlc_C8eq(}EGwQ1t z^eIvGGYRD?HtSGUw6vD@kV1~TVsxCMtjk%t8_p5(`xYVQ~np9*$&aX$VKQr}S|z5A5$>O`J~1uL$uz{y?TDy`5(BDF#Mf ztAMT|Tt4)i^nrVJED|`Fufg!RN0IoSbQ~H;AMGM#gYz{2N(t<(QbHg!(9wA>Rvt_p zp48$Xrv@Iswx{d;{#tT8;Qxc3%F1v3II(B@$ssGn7r7=T1lZD}W)4~CxTWdg!M`P6 zxjmWUDubE8$>HH5yam*exQ=@D8VkM{>I+CJw_4&jR(g6otV-PfZ== zb%?i+rU--blPQ$fxB{n5Q9B&=`s|>W^IXz%84KR64f)YUDJ9+0?Y<(|>x2H7+8G{& zLK;#Gid0-0NT1W!F69jt7Y`|tAw-oUMi`3t2#`q8#2wcTPtWOKpJldR4)$uVCV?CY z42nTY!NIj@WKM){P_)6>PiE&L=Gcyg*lP*IZ;4nih~OlYbi}>gO`bj&UI(M(8f53h zv7|QP)zr?V_y`0+g(yp~1_4^W+?f+VMcE=1*!`rbd~tj{LFI(6kjRVuWEso$-HzoF zE9T6Jto~GX!mG)l2&04;jBfyhbX~!bn&CPPXjM*X0903$d|Qy!F|>J8o-2@vq@xT>Gh<)5Z=tLT_JV| z)WmJmVCvO98I4xITzz)~pa^GTQdK$|x7S4+pUhpH4}fA^kfYRLun>Ygr(xt1yB+V? z1a)BP=vOo%j$LVLuuRl~X}B|R+}Jr8Rms@|y>?zDqWvNYmT5#B-S*NA$_VFcFsCLA z%K|l!hS3+sqnus^NK872^#kGR8qr(}Mpj2bX%K)AQCx@3&eKxR&76LSIxo?M_Lwxnmy!P&$)D12qR2rbjrUUv_RkttPe zfx^w<{`$JQe>EYC(os!mDbgBQRm92FOp(tND*^~;|FLxMyUv|o-jhqguG&U zGFQ*T0W)&u1W@j?p`6=^*7Y9FTq1Iqp70;y3)_T4dWGF=}{Z4C7IWq=CSxdt5__h-@oW{7dp%kvM@lb(}4W)LMNF+qS5~_-G*3PsXs?IE!|cS-lvpCy%XF|m#ft)*dxU8xwuiJ4Jcc%d!SL|R z3R013R3k$7bTqjK@xCWQyTUok03F{d7I95lLrX;NoXBMwP${^@WkvU-$>?DJ)|JDY z;Q>_CP1%zFOam=?)5-aiq)ggLk$;jzRF;Ds9rtJF{*fzr40=N64YQ;Yu6=B^9?p7MOhFESP&-mz53dOgr02AM zGd(9Xy$HU}HOLH)thQ6bqc&bZ%$nsZnuDPrb-xC~BP$U($nDyi8^h_ujRA~TEi9R+ zK{F-Ok$YkcHap=`4PL`U;~OBsDa5%XDn2-0gVBj1!Bm^JqK75D`6M0)*CaKOV_nrd z!-b$nrzZ@hl(dE@EHBbPgMG0LRJR1PI+rxFOsW>Ep4Olzktj077Ge;gQ9e7qa=GjP zC@1kI`bxV_8s!5%zBRlu!}lk~Q(KdsGdvd;gPtnRvra_+X&@uG4TOjx_UfPu$VxQQ z({Ox)o|=jr5+cE=?n$5R2XoCVBmxIOB#Y%L}oV)VJV4WyEo;DpNr1kK0 zPiOAIzSUEe*Py{!TrIab_ja+Z20c+Gm0({-9=JZ~ODNCJT#^_7)$j-Oua-p^1?<6q zm2Uwx#IZZ;WO}-q?x{h;*~N`Tga(>@42TN#cx^bWyr0RuZ+B7t zk;QFE8bjq9%OdnToqS}SI+3ZTb<}}oPLn9dg}Cj|l@NoWDMDKnWh!|~=gyo6h2e%v z7|N6PbBh+@p#A3l;gHR8VQOX8{}!ea&j|aWgv+RRdBP&br013OmsBC zB1Co^A6GgQZhD!_9=slyF&*ULrXGYDg|)3Lsts`a`-2SdxD4vk=$?>tCVLY0d6Hu8j1CFR z6^sVRBk^F97oDm96 z%KwqARRfvx>|p9VBe1JYN^XOe@-*{5pE5C%atiGxPUslubx#`MqDsp+5s@zx-$frC zodH_hDjWOa=GK*q9E?+bC&|(T?-c{2x8VNK)E30D8df--IT{%~r-A4{pz#(-6cv7e z;!Mwp!$k^4v!m0AjX{wpGKJz{YUiXaikPJ*=S0Ruf;5~1&0%2fwS9nyhT1-*D@$pV z)6XQzA=b1Eh?LTE(mr-n)7KXu@zpJTQWP zLP)&bPUehu!x`7~iZ4n{H*A}1*Yetkfh7&!d{)shKwTLJBKd$`CT&u@IhauW zN0f6VK%)@#`81FbRg|mdP?~Z(idYuf=!tKaKIXVwAHgadM*wgwl1cGrHM-*mFYXmBX8)=j;=2Ivq z+B>1lDlsv3c-n9Fa6uLG4KY253qK<5rx-g^%Bc4Nd-iU*uJVaQ9KkIyFs>_*Dq6A14jj{fdMGhIeDh=xd5CTz%Du%qa zyFib9Wzaq}dnZC083O4Qq1*}4CUW-SX1*q)f$n-F2OV*q#8Cz{s%SIPJ}ui$cC~Ap z*Fc;ch~`*aVvh4usJLQ>+&1YscIkf6IpL25t@KSw`rDc$ZVgaHCHa@2cP&^bRqy5#HV>c|yj z&1}#?*9oy-xZLjcb3V~eff|f#z;N_k7`!s;mwXs&*xymud5(utSI_U z1hVM|5m9;Hxw4*vYG86wH=!4`Y(@7o8z@B`yiuzn7DZ7Vmkra8%ZS{5$e~N<4UYfL z`t$+^MI}eM3g>y4C*pJK!n<-|4S^=wZL#%C*FsQS@H zPJEk&5!FVWFM}Z#O(g!xs8enF;gpgZ*`ZKoR~$bFe2!W)8W!gKsvpzDiUUKEo`UMb z7KZW2)(2^6EJA`FavXFTZxC+ zDA{-72EmOQe;G`Sj)@GLft=6b!T1G&spAVpJzIw{Ys33gloj4!G52Z`npn!xeu5_h z(ZE?BR2k&a>JpOfYueF@=<5k*eooOiA_ZIJXdpEO4|J9e)dQ1omKGwHz3xX}kU2Ws zy<+K&)V**e;!*AHGTg$wZ8-f9*-@1l<&HayOShlHt)@)AteDQ6^k#w@QlSCL+2-Ot$$jR@(oCSM%|Ks1I7%s~HQ zSC4)=KSTNc5fFu1x0|lPB8tQLZZ~>pTgM#-Jx-T!RA)o#jWSesIYXmJ35ARZ)wK(* zVTL{+4va{XPrm2Gv0C89p_Y2+Y;Na6E%p$bE9pDTd~`o-;Ze4Y8YHUyIw5z7fdNfw zDQ63pE!ln$9Sh>*!x1a|!5J~)_RGTHXx^l0nK-usLpuAjQ5Y@~TwwhKuQHjWWSfG~ zjAG5GV)V8$BZ*9A=}+Po%HnaJ-4>)(Ru)_z0gG8>?W_vL>;)4!v^cvY^;8^Hh?zT1?2@;}4 zr0aBC1dZwLU~t43LK83|-G&=WgO`Uq#t%+ZG+a-g76v!iu4*vw*n6&Cz?=EFQ3H)F z`C4Kk{q16CeJ@JRQGG8$2^QIg8gmA(T2H5}0A}OZq2atj4m%7kmPcu!!QIe6x-fXQ z)l|#1qOyh=thft9{yCN}Cx7A2*alkBAq@HS%Q4Tu+10r8hLa1bz@i~>!EQG$6L7l` zb=g8RslH`vCV1;e6R1R;MFD~1NzLFKM|{2C2U=9OAMB%HgoV`6LF?ri>dYKeV;;>> zw2@iL%tvbmpgG;87@Rvca%*HM+HM1bhniyTXM=Oc!qgN53J4l>V%m+oc`}eRTo|eY z#{|$=DPGTKC^9%>Bg~MXk=U{BX>sQ0WMWCV&r(i0_Z@#gM|UIFrT@OSs1Uwcki2oINa^4iC@@Qk@0eGc zRh$S#L1QPJmrJ6`4U9q6#NCBDe*t?LhjzQkj6rxpt^tPZWR$6PBw0N+ypKjv1q>M) z$wKO6n91O=Y^o@a=r< zCPvN=@HLVWfKlcyk-NDkX4Q{KpmJ}Yt~-`=g>n*)Hn z9yopYS>camv`?$#>+O8@)Wr;lP{51UsWjB5x0RJ}g^_7>eeKrfBkLZ; zq{+*fs{RzhL}5f(f!bJWmMXQinH^T4l3ZL#MPWCyu(pDr#N&dT_7}$zn=Tw`6|R&h zW8?(;0gCk6I(>DYP+X+1w>eYkutV8^;-}9E?&Q6uH*$Kb{PjBpsky-s)JlKfm0MXt z+JSO~!Bj~^K`_1&CP}wi5(`K=A*^kUsO7gkLr^a*eVey)QS(kh8bAz>ZH4PjiZ9pp z+MDtPy3XU(!oXou?T}AvGJs6O*(B{YaV-SuS7}PJ5wCp~Io(NDt|}hz?#uR35bEYN zQi7BR+AfZD2nWnu#PISqNK@sb@jY?dKi?y=JrE2;(}|FXyv~O zMq5#x9FG!o5jZ)kRyT{Q=Qo$D=O@G~+oiCK)Z{G{)udHBU5R{2;%iGV@Y*;h*^{_8 znoX~ZsY>>=Ye(jm9c9A(2q!iJql>JYJtQxL3L{RXHvCo_EXgr$wT$a~looE;2~>*| zM~FUbbXSxXmgm!Wp|%PhK|(@OI6XXxIvS6nCX=jov0g4X8`NICTCcuwN;fjBDj|u9 zSnQqtME&@WPY;fU{fdwg3{nOhmZyqo>S7apG3$MsRvPscUZNCRtFign;vH-OdBpTJ z70j5;GK)X~vf8FO9BsEhOJ%}j?_i>{u|U%&!tr_V>HGlWXb%Quu{pJ=h3ze}h#Y_G#cE;pjlp)r>#@QJ;Xa zZsPRQuQ2m<_r!(0!Q+U9ZxmDqxV+Md(yIe%K}5I#ak31|y{%M%&M!ul0Wh8!yZsJ^ z-uG?BOf*jtljxr!O19H}ONn9=LLyo{+_7_R7F4UXaES=FPq7D+Q?p<6zIuyOcjo=_ z34JxwuyBMCkwGBz!L5edh>A9%q=%3ok-WOR<$S=*)K2cl z>cUki6?lC#V_U-Zbww z63V(9tLO^MDo_K6t%F#~R+Qh>1S1yCd`|d6*OFceLGsNV7t+^~E0~Y*F{eOENW}*C zW6N^!49~JCBz2(rJO|NOE#H|JU~nZUvlDqbo&L{5>RY&N8lo`a!^1YUZ1dfM#pZhc zuq{^%B#%J@B@cwMJOp0js|U*Us%QD;tNGpXrr#v)C%P(|Vz#PMV6S3O2+JP~XH^gO zgfwBFDc_~VjeIQb{c6?vuJqIG$|bTEtLn1{kS$-^O0ec{fp|gTdmA~~y`TQGKOcT! zvpYj$k7;H2e82w_cjco~`TM{8>2LP-_Wsj<_|e|MXP@l-_mdy*{nvl@1{`$?Qd!Ighy7xcVpYHve51;P+$G`b>ulwJh?)~{c`fTri#Gma2|LwEAzxWqF z+56A`>L+{u_}~6y@8AE;Pxk)$pZ;|3w;z7G_g_BU+xrK5KmA+&_v^h+_kO ze#YE~xcd7yo4>6Q|5C2DSn(f@p%}NvS?-Q^s#`!aTe!{a~N}Br_fB%?Xen}r< zEd&kzTz>W|`Bc!GSRvI~t<*1oS5*5WU_a-dpmy<3z>5CFx{6W%f`32bw;$8*=lm{u z{}pZijL$yj>CgMVKL!>P>pCf)jl=HLDd; zv?0c;DC=WzVvZkwvlzLcRKYv9-zRzyR4B$TC`({dP^}t=q9n^ z_RGolh}Hs6;w}G>)esb8aV~bBnzh2Pn32YTz=Qp#PCW6p&)IeA-=FOL$=?6Lzn}2^ zC;cNH*u;-Ju8;a!hmF+Ezz&Px9uny6_D66_D=1yD2qg`+QhRpx@KIeJ7QjH z&sO4^k$DZTBZ7*phG@nOliZp_)!RGZjDnR7^*nvgR;iyQc%f4N$2+p!CJ{w#$f@NW zIM0fjTPMkStomb?;2%Nm)7-PlhFKb<3`Qg}wy*?!i=1-nx4Ot#N$v~^$%dZQBhSj5R4E-5NiUogD5<4O@!!gGkXRC~*Pt0k zDQr8g{E}NK9>&gK2yu++7IoakZ}HPG*r^h3pfS433upPOG9r!xC56@K%y3R8#}kSm zTXlJcFNV*oQ_pHPX0^x!6;Zv*UQ}mwo}^$*^c^}YL&6Y}d!f|gacPG{)#sMAVZnY& zQU^0q>cX&S#I#t0)2t=CZCVtd{kMtp;uc3%CY5+s7QC&~7Mw)hvwenBPzv&5@7j5m zWC=(PJ*$+RESGnPfr!GPcs%FnrFq36c^Xsd28ABB8}sz&?I_lPsVhO0C_3`K zC*I=ColsY3^@O3c0RPgO_{)&Z`d(_DdJPBKPQ9CG6N_l^02cVWtJQ~#W1%k*t{1MU z6+(zbmy0|%l+YKc@sIv$k2y(kX*2Gj$Lm*J4 zeepP1tee#e1+^7JXokQMP!FRM8>9CxQc6HeTm(&WQbt6lTQZ%?;_ltto_)NljLCT= zPDwW67AFGVB`B3_C}N*?i2M6#!dmm-n|5idm~g@jFNvzH>05)Xf@B9b0@ z%z%6rg-}200LX1!=JyO>h`1(_aolk#ABnsAesK=uf*^5nNnXL;_TV^PT5TrP%rMm^ z|1s+}s zZi<5(v*Js^%^ndi1veEzycFD&1o2XEQ%QE=OTo<^5ibQd4I*9&ZVFx*i8Agl1vdkN zMqdhU%0q+VnJ)!5*%>bdH+xo@crOJv<<591xGDYAUJ7nr^gAP^y3b3&O?V|f8ZQMm zg*f$6aI@bUF9kOhuY4)E*%QP|!A&VcycFE*>EWf|reYA(&U`7j$;tUraI@bSF9kPy zMErlS;HF2Zr=kuhF!5C>^R9ikzPj9On>ZsXZ05ux6H!KPJYgs$lr8FVpR`MkB{cG= z8c5c-NJfUa(PLz{vzAwy6;!UHG@KVL*Nf{X8LoAvf?V8YWlBX^N|Ss|PB@Vt?|OB& zT5lc))>mpN`jpNq{kS*ds_Z{1(~tAAm&&4wh+is;_IG7MeP1ez3JLI~vZ$trm&&3& zkNCS?S(NzWmYj2>Vh{&|NQrv?eD}26%K31S;$tsj`PjfnZ(!!0H&WDr$k zY&8*?{`z_@Ds;YnB7M9)L}F6;QCz9YI@2<_TfTWqw!)p3c^c+HLTPRjwY(wOok*0s zT@-@|v+tL@^^aFl6-z_cVRWGauJWJ~;iZemr?-Jjc4#s3z4OV^kTO=(+ivw@kOTVg zV0SgB!a==1vee2|6Q@22x^L;WF02oFT1)m#*iJZilC6ZK~K=3&0|(xyWa%*)saTOzw95|<3ycNe@Rk2Gmi zlvE}*-{bPb;_gyq<{mU`%O*@}jiV_iLWIDSOqUH)|MKCRht+$=Y6AEd@0PBsT}rXR zpkY_*7=MBI`Q!XbWG`MWY~F={{KhR_hiNKPJV?p*&E2Q~3DYM@2&wBM@7*`NFMkk4 zbFUYAo$QoIYfKK%f&xjqgmgt}T-%bIrX)#@6H0KI?f+(ee@~82GCe-;CNDrsnW(<;$n?@+bp{8oza>-ceZ3&1==FvS3FJv|o93P0L<##zQU4%1oy?hTQ&b66-1!7M z=&h&9IFL+yPI_3kDcM}pK)8u+QS0-=F1==6O|`BhpysX#k5_3NcHA>FicJ+!jm6L$ z7uSO-&gBie$a}MlB0iIXvi*0s+|3Q}?jwsv@9V zGzmoVO}M((6{h0{F>;6JQ138eA#rS^sb+S|zmoMDB;#{m`-c|SCVVodHe^N$CVigY zin0tUvF_#O6?@nu7AZWc5N0Ie?W-niB&AX*VY7g-MbGoQua*m&!iU(*zwN3NWCYJs zuAt=k`I_789XDeb*ksZZVk9Xo$e_lGSO_vYj$gfMopk~rrgD8pZN=VC`ELFsxNWrD zaE^UDxLVUV@1mrEWXy)^n_u>9!o_7B_MFJ<4iC=EK6#^JVEXMZT56MkW z7Unbx^0YtMO@3dh9*AV>10>S6uFE3pRVej$b{S<Lzs$BejBqzN2m4gh7F~#dJ{j)V5~hn@B!JnGNXA+H z0Z^V-xroE?*KeNhSqiv|Ov1k8GQr8nLH*#IxRuuhRLYAvlT0^ymtGv_5eaJ~ZS9}^ z&g}(hGOI-fz3s#`{WJzN{DZ3Mjf1^6bU&6N&5Jub1K!6Thw(ZG$*IMz`m!mT_Uq>2_^U6;_QlUF z9{xj$3jHywX^48aWk#)nrsrXukm)%BD7K?0VEJx90u4oo$R005AJBDpAduiLtdg+E zzz>aDR1=SrRYezd>U0`ALoRO)9hN~LAUVV;N}n3hK-@@>TrY1$#cmq$Q7qV z%&tG5`?IbuzeEYF0UrMF0#m^cE0IF1U65oc>HFG`FRfy#c4m}Xj8a&SDC~@YATa-C z@pMV;9_k0Jt}o{|HyjR#X)Z`yhgm`mC5w7-`MMFs9FFxOj4-SY6J;Av+1=hkhcdnB zQWSx4`zpIMs3_EF2-aLTxBGOV8j2uLWPxf36H<@TPq-k+rxcVTtDWg-Y-_0L4dJMt zk&r#?qi{D{cVbGfW^I<`)FSWMq}$sSvW2NQ!X}jo8BM2zY=s3i!P@@bFRt@jhnLI>T$spo?=0&uAbXjmga3wC(>n#46!M>7<~j5rIAx* zRvtK-?^c|i$bkCpYgaz-62#D^tl=q&>$x;~hpbQe6gfGL64G(HkUy+S9{KDtDj5|S zC&$X}mOZFw(JbviPzmAHtN zs?#Ve(6^4SrCtzOE9llH3kI+u)h@@<2zJ$70EttU((2C`ceqU&k=U6eS4P34w=o38 zeXZB2!~>Wd`E0F7!$>SC~CUCP2=@0K@W-ow&#KeU1##Y@E4rfKBL=oCN?p)oHE)&+v-b`|*M5}=Nqt=9_mTbvk2O}8As-}SZ`G%>wM9wva z3vtvXK<={hYfCbJIP0wzz~pP zifMr3*8K5N^0mHlo@ODdtKUn(N3stW@`si8#S~a~;-r&j&Nd6^i)b>*DC{?i+a={0 z0?IxL-TsK0L-H#=on3q>ZZ+SZjnw|Khk z6Locy!IkS6>rYHc=7lg4X?vzoOJmq{VPdK_=Gf@;x#M<4fk!0sUTG$=<3gr>*L2+9 z$7iS%dSY&p@eBZ|Si+tR1-0H%5FX?UZrC5lP61;fg}56e^C-&EX}MKaRhDO>Rw107|2 z%P_nKK3#4Xqqdr3Qy$!^Z;+0%sG|6F@^Jx6OOTF$^#cpd0@e`GgvnuyUFj{QkD>Ur zJIB(`-~eQBZy$PcyI%>;Xe*gZ%RGmc>(a^`t0>NJY5k7#qgNrhJ=Qhm+ZMIrC<7R< z4(?C`NR-|wduwbp7OO0c7TLpmSLoqXCK44Mx~&S!tJZ z%N=VL6;W0J>GC*HyIwL%P5|qT?1KHk>c*5s7A1;BCizhcSTF8Z@1Q_6!w2VB1`;KC zl~FfmACHV#-P5!k5(g+pxc_5U zo-VxvZ;L!{Ck{)82!%M|PO&JdJ6upmWkf<#%)s7Wo~*)~l1B}S^#=Z|*t*arEpL~i z0JYYvZ{E%yp&r58o%O7|6#kRv)KZ$DTVbga2mAKkB)4l^paN+o4unZI0-z{gpZF8} zrzuIdd^7mtVpR!mn*`%TfJH0JD_B|$G6{Z)L(ir-42T^4zWXP zmq8(`+tb_;w3LR~h3w)WE27rDj=D^K$O|kWMZm=_@o_$!SPxC>Qc!mR5kqQh|AbFY zQO~&C+@g`F+N{RWt*1Ll4~l## zO|Z099L2mq!6Gh}2nO=RD14klKkO$VFX$yp3Qx zTzp!>Jc|=N^eoA=8_<;Y>I7tUy4WJgLD{Byl|W!SoNgT7uvDnv&~heC@Qm6+<{uQ)g{qT z!vLS-T!&F&N&iBer}y&*&R3-!f&zrr=;PYZ|;?zfFEY^=x!@8?SvZ-tttCt$1K5WCKCQi!M< z5fMF!+urwCo+n%J4@rcv=D6GUmw4FD9p|jtG0GByI*$^3U~q2jtEe@S(8q#2%8eG% z2@pZ%?OYiktYa;uGgFGmQczYIERJs-w=PQyAZGQvc3k*r-d0_mr*W~PZMfCiN&;ni zHIBt8-Yh9eeFF;4n)65tb^Tc)c>Z#;kt#(47-KyQDOQ>yj*RaWOM*gcW&yEP#W?H{ zWMa9HRc%Wjyw$@U_`F#lExK@Ut{9z)FFn~|M23l3WrNw?7LGWipvHPwNOEgfyLY`W z+82_*2f!{^9+p|t2`YvC(_QZvEF@CpGU%LVE?kx3sDNOoX-ytsVy!`>I0H~|IXv1j z_Bh5*lFw&-<#vQUbz$Aq zm^i0N#_lQWK^PN;5eIGPQ$bjFs1yW*wlFhhxJKzC6qKS*iyBn01S3>Ax*L4ph6kjG zG-1uf-tSl6g{xA|A0Mf5Ykox00Q9(`&)x2FkFb&`3ktS>4<~|eFh|H}tDeNf2Xc@TbX^lCkMgeuq3h6%kiI?XP{ zX{bN3w8SG0Wk+X=BM_?6)b`k6YeM^i4o;Dc(L*8~(&v@ngzz>nef@UsY~Td98cvQ9 zFRtw_`|UsM*YwEING<0$MJuY&+B*r1;?=@oDXfYrqNu9aPi90yz_DI6LbiGdU0qhlI|5LP8ger*Dco_G=n`~qp09}+v62#ybx3Jv+*ncE5j%w=hYIIV=c;hu z&}JBHh<2#>{!)?{`&P5F7ma`<4raw_EnI`((c)E)-+RA|3>Z03ZZ5cul|JS2x`15) z(-$5ClGL0PSKC4D#rYlb;f>w<#2I4vt&#{|cFXp^TPQ<&UglWT;ig(8bvr+}kutFo4y|5SExwC{FjIwLfR z2#>lT_*IYZ`m7({(eWqbEjtyBylom$BGBESQ{cF+o zKp{_q*?vS=06r3FZQb5WFV7DOfL zvCZ}m)Jz5_u=BxOR;C!v@b)k;8gGXhR&`|OgVzj!mx!abpQGFTBhl>a^lFseN?>4Q zL5e`C$EI;`>r%C|K9Cu{;T?2fY3H<`$HCFeT_H0z4$2syD8WWw#joEjUBU6Oj6x7WgYG^iYoCa4k-r&Q#|DM%cTTOXs|BwDa5yqouk zO3Uq!Q^fa>7+`%p--5=7O@L^gd)8^u9e7r>p-`a;ceMaHfm^aOYXWRD!W=l+@UmoN z!U4_RC$Wm5TnzD!jtutoDxVzm6tcC-0)~SbVa{S-!^{o_|n6W7Dj}amu*ZSlYu$E>c=!e=@qfzO+rL9+Br*2>Lz$_c0S5gDrCgU?+O%&21d_k ze>TqX@VAKCCai_RTlZsN4kutRJ;Yr^jp5e7FdMl$_GjvcLbct6gcl%-)&XLoftl~C z`5Yb`j&c>IUJ6Zf;m*+| z2xuAyw>|T^z8XKo2(yYKVy-JAVPT zj1XwKis6z2RNMJ*A+E}doz{7Gi(4U=zQL*4por+7rp2m<`tC*submCIF`svBK)^uY z$)Yl^hXzvufjU3J>QMH_jEr7=5(Ak=%@4XFC$E2 z5@ffVu1N?7MsC}I(L+-xutOuxy$Ly|ob9f+;n{#PoMp~DWJ(f*U^vqKXqf%OaaL3l zGVSBPmT;fcFsC>D);%83lN}ol1YwCugYXOuqx*qDj2?zHY=y$^2^UZU!-&*@He0w% z&-R1wA2u{{Z0xe4gR>J?EV3|Ybel9S6KsWgY=(69XQMD&04vncN!qCsa(jOewbqs> znK_8icoD6j-0SU0g>{G^A@0bX*a2TG);NFTrDO)h=Xup76)^_yWGu+V`E0nw$WIuP z10qHFsq;j9{dTc%yFh0cRs@R6Exh4we}@aL(*@3pMVD~e9q%8V9~~W^i2t3>@rW!! zVl~}8Y)u?+#{^SMS)=gPcyrdrB_8`u6wF-~`ekETk)fTlaoQn}0M{(y3HU|#b9CLa z{nMGt!)-sX@RFkCQEU6r^tONEl8)UAY_*h_bhwT^`V7}O9OpWmUM1zhVzjJgY`UMr z{qZ9S7($Das78^a=X28UpV|D{$3u(xX_Xo!h(l8+RO~PwI(~+qxbH-e@<@-Ie8s6E+3rJ~@cl zWms>wsKO343PO^SrMI^s!IKRuD{`LbPVjddc0x7|(#;_Dv_iWhuF=X#)Iocbccfav zdCiznhw*ACoa-ho0#w|Jf|RPuooovg69Ao>acprMh%e~s5Orxbh_TQ_Y@`)OUTMjd z(TLoN5To zEAGKum?W;CY0Q^;YzP_h27P;?WW*g9BC5sMs6wGZ_HUHvK6UA4yPys5@h-M!xfb2s zgO9H4&{Bvqt1*JuGfBe?xQYvd8Vo|qu{Q3E?aaLf4q>=0l_eKkJsl%~UX9-!Ne9uD zanVE=3pI>J!I^tly4?t;Of<=%Z;$`0W2NGO21Z$Ui}@(28C+n;rq7f!mr1();7S!n zZ5pE=GH>md=X@Hb&7%z4r5)Qze?x%gbeDnXtprg> zNWic}x|8mtl5~v^i`)Vc3DcRP2jTXm`L5yU^n^wv_%()39&vJ|sv zfqe95FcqgJ+k^=dSV6#K5=C7-^q^sOKM(Vt`T2U#)ai|svPJgEhKfDM7xLx!^wts) zXV}!q_LTv?!^ZCtittS}H5P?sS5#(Owy?zL2Cp~p;~ds*&BR1D|Nod?wPDFfc6K0N z#ycL~7GUwm%&@V$g|#t8tN)u4)0$d}gzyVi ze@<2qwTWnxq8bByq>QB`1tC<1+B(rIDlr33uU_?@6<|dn{P7ioafHS;&Zr`@F~x{) zrL-K=j21IeYIfnShYxGMv-~*)=yz%|nq|b8D8d>fY-pJk!mObtGf5pH#Tf2D1`|t# zcvqzlpVhEUh%uiF8BA|ui3HjU)dJPRfq}ZMHQ}|J>_=5pY?!K0n~4k@wrPOzj+`CD zEVbS*R0~w9p)$TG!;o&YOdGv*{BKMPTlykC8pTwFv16#GHDqM;ENCW5jgL0%pfY#> zjWUIDb`DJhYcf?;Jnm`cxeB99G3MHQ7%FNqY3Zq$6~U1z#$;B1^1V5jHO25mw;jz6 zCfe5!A^g^$*oQ7Fx-n|-)jn%Vj6N%5g4<^v|!o!dEV(B z{F8|;LAvD7Wv&|SRIJ7d;Z+0vKa$0Oesa#E%S^h2=)&ZDL|vlGVGk|*u`Rn8U;2=X z)dS*{(uL{DCaRb&MY;wo8wwTC+f;u{4QV7oW!mSH=~79TrF5y)9<^?0D%RE);v0$l z9K6yeXS*__dZO5+jHtz$0|&08XRSI(MMpOaD>xA7m>#eolgXDB*V1AM{12+8 z4j=1zr>9PzURsJT;OO6z;fm@Se3go~w^jIY9m9FOlf9GU5u@LJTBJJDE14Zl(s09D zuBG0z%F2vIWfLm3XEEQVKl3_3e`eEuyg1;h^3zi$njCa~MwPLZ)%dC9i_&mt&l6Hp zCsd{^s?0$3X4ETMP#wo-1hwb1i&%*DXHzir@J*`1VF>R<7nzU9u zt7LJXY=*Hs1e>)B6H+D!&nHYU!MLTsS%itF3&bcFdDzkrt~7*+55@933MUmI@>ESv zN-sLB&lZ^KY`sgRik1rpJzHnYrQ&V4wZv@$z4I^(3eL7u;e+&yIy;iTQ)VLxHkXw!qWN0;~ zien76u1audwPhvqc~uy%vTV3~CdI}9@Apky77c@ETs7lH`H0Rb`}+@%yH&{S8YMh? zR!&AvUCpw&NCn=Bje_V-1SA0)2rb;SdJUNV&xcMOV<eU zYMIz39rd)Bj|WQ+kAQQw2_8m{t9B<00L@)Y2&UP}xtW+z0rm@PN;sa!IW^@C_0~`r zm?S6jh6@#IHux65Wz6|rZEj(V0?rh z9`YX-aTC%dqTMWlEbBrw^=1*3YX+lC@pW@zKGP&)b&Mejw#iZvKuwanMG30EFtK{4 z^34K<9GQuQS|%Zjn^}sSvAEd@7V{stnxf3bgo~Y! z)zY{?l%a8Uj8GBVpj$?}$?lRn+b-=m$AbY}Sv6 z;tDg1;uq3?vS88C4#vK{6VT{yNrH6^Q|dTB** zT`ud>)`6|IT6v;VR6mD*mt}`h1I)GQ#%$&rl!nUc>MLj0RntpD9u&3R&Sn89#J><% z**VNwDojVki+-YwfN+VD;GL+7hNU8TR844}G2j4u=IUjOYQ%uT;5ZBaJgS2*tYUe& zutBRc61pK;ZB!7b+%k3MDAE^GJP1~P`4u)1oLL!;(mZ=P{p!dFhJ6QU!wf@B6w-Lc zECEw3ih2$bROMR0qM%vys$3JeJ{(w98(z)AVbpEp8wBv}VB!ZX9rtKAlQL1+)390hn`BrUKx{j>4b;>mYYNOwvc@*+)VjtdwHnt9Hs_;B z!t7)g)A~hbHl8R)+0Q0tP*2jNFv`_V*pE*+=vPAqTSGj#sODxTn6tD7J}zHu*r;G%HZNa(GeT5oINW<@DfR$m`pQdiTkc!{kvN}B;<=XX@!PV*qTZ>Kp~ z4GD^oMNx*t+33*X(+&Drzc!zvDbn2Rf<{eU5G|&$j?*M{$5^5^-jR?Ud{%YXHh7G0 z6j)NT5|4r*W^pnq5NLJAh^lf6+K`U| zY!gDYMHLfU78P2&S?el>t|D%{1~qJ>r^>1hNQhNoGt;mqq3WPUfdAXXW`axuihUQf z=Q{kjtZuc4fX6!OXZuqbYI@ z>o=ICtfr{XTQMAOD#VNx=U_0Y5$s)E8HOhshw4x5fw$u{&J;yaEuwk#qLN`yl`D*n z@z@$B{w+OfV0z&p*nF;n$A_`h@r*Wb<6LdfDISf3KgKe5`OVVygElUPNg52t3;{sj zk7mKL(PAws!+a0fnBZX$R3F7RzbDb)Y}90aV)JNG^6HBbGZxuzMbZ?TmB-oyE7Q_8 zSe=nq%gR*W*n`#*AfD!y01P!dt!h-h)#M<8TG)yfh984%qr*@&T7~$$o0Y58HV6RE zPQzeMjjnKD-`SgaY}U@Ilf#Xr+#bPt2=-1?4wK_{1b0oCdNb`U=_CAmcA7Pnw==GPTB+3x9VGkG87k6sU zdDJt&|0@_n8%(e#(^x^9W~apCRhhY#(0lewSbr4b1J31rbhTRKsYJD;p^1u4x_Z87 zN~*7?RZvpz@#Ed5BlRMD5}bn1peCEx?iBGjX_D%&ur~#NTt#(V$qdZ@V7t{4EQ?h) zG98DX6|i8M0W`2GUCBb;8Dbf?uFfErizOSKVXD!jbmoqk1pK3*Qv^B=ow+Y#Gp+WB zsNuh;S++Q4$blnh18atHZE{}mDFN@uhv=Ap9-Ei9J>)T6`!fr`w z978Bc3gEQET>$8lVTh_aN33MHt=r%X4rT_Nm8uvt%F-JFb4%r)3*vULS;;pT?XMgEJc#A zmX95jF5aXR?>L${GT{1xKNXlDd`WN{2~4ULXQQtenE6(mC48iBH82q?&PLxuz&vTiS@cn{cmtTP1g^9E z_z4)t1PI`W72lq48!0dhh)b;e9Ru9NF7#3OW&%?qaGiy3H83q*=%f670GQ{jIGgl4 z49vf+I7|9bemK%3X&_EIv~;o2mkLa#6=%^$={H|sm_l4)rC&L4HF4-`jZ@zp!2PKU zeN=v50_IIC&L+O!0`p%h&Jtfrzq8X(KjWmMv-HaYX0{b)(MRc5FEC6YF0s<@D&Vf~ zLf;_B{{@)MR-8?I4+8Uv6=w+_#W!K1Bn`kxM`!UJ56o06&Z3Xvdx^j>g}B6uZy9jQ z;?SqWsqZ%6?vF#?3vudu8MrsB`s&Q>0yS6PMCtQ-$60XH3=Ny4rU<`#lcI4ca0YVO~R1Lpy*BMuye@0^QpF&uXB?FV-`4%|rKX2*dW0Njc=ao5Lz zI}Q5ojsr*K=!(kT>s_)aIaMAG~ zoIg(7tT=HMapJ;uxbh`e)K3zfLWHdr9lmA@PU?-Zx7$75AIR~|4$i`d=u<{DG*nlN z!{_Lu;$j!hoRd9cmIYfJ^cVRG12adto$&ZuoX_A~B_&XsEoDzB$zHt}b5$ivYL-=& zR4&C^f6Uobl$GEwv9y6*eF@E2me3x0wRlJymtL}nmW!6GsK0PUYI@p*t0tviSdXvq ztIJF3>&hA0Jbh`ID4QZp8z3!`r2W!BX|(jswHP#sdto(J@|5GU@{X*W zl3UusJ!EC$F3jY}N@O9@y@M(-D7wClcr9%W1LRi5+T0T=k9`72P`*65ZpnDUJBV5h@MbMiv z-2`_vAIAeBCgGlTAg#^cI-{HL^n4{dNhuim)1kB5eCKQf(~XdH_qXOJv=0uX?OuDT z8yEqXe@}aN-)1r@WmnVggvm1px%|77Y`0(8ibTI?@?Z~q3XjiBNP>9poqo@(vTMW+$fOpsCT=;Ices1BHH=?7mCQqKW!CRk3i^uN z_bb^wWmjPTX0ifqgF_I*%sWX+vvX!5|AEfTSth;{LdQMT; zc?>!RZ!m>cF9&)UZYOxlSK)JHWxuSv-Z6MTL|WP!2C7C&C65KSeW~2q4`^um8eB`+w_j#z>UFlq%TnNin*Dqz&@pm>-c(p(=0#bdNnb3Fj6 zh)KMsx&9jz^>LiiNl?_gb4uNvl0-u#r!)vu2BSuSqVA?sN&!W^9fXf~OkX}I9_A8I z)XjkFT)FAXkg;9xdt|vO^KKeyhlg;pQi9;AIo`A*RJvW57`K5)BB7~iI4{aT$z*J# zMVk`#)XK^(VM+a%7T&hVkwhvc_AVP^x;z%sWm8O-wwNxv3@(jlBZiSgDu}#ham{U$ zTW5LPt^sJMWaT(2Wp^^lKw29p4|NP>Wv?9Zd%T25sRB1y8q&Hdfr|%Qnb=-KgE+({ z@s1rs&M`$Lo`s_7P!3U2+oGQ#bY!V#NiY)jtm+s{v6hvi9fK*7tcl(mRE~EHrkFv; zg;74{DQ~k1hXAtjYR6zo>$J9GGf6S8X*vc|Dr1bUQt1#D8f|C-^A&ZrsGPl^qf)-uDr6D0qSkW zE5X&ns4H;g#eWs3!;II0E9rDf>v83>w}E<(@&2IkSY^$4f7N*Z1oa`~J*DwBgW~$y zG~P~7ALDdNdo><~oa5fncpriKH%=!@cpjFoG~D+Zj@o3(8mH6^_Q`QQKyiKjHQr!Q z?F=_mLyTMGwS!Cc$z)}iih9@P&96EN;@^z z4>Z@$HR?x=N+` ziAI%!qGsDEU9Rz{TfqHY3Ch7-uhw|Y8l`~h&RlQRcz1!yV7}c4suy#8P;>p8=K2_@ zzRdL*&Gk9WbsH!bbEOU)56kPC>sz2sW3KOLt{-Zy)O=HJJEbo**Kak~lc1=7=ahcc zTpegod6=p5e>QWa2A}&oSaTf;YB+NprMZsQT*rYTi*icon(JiEmAVKX=9;6q7HFs8kU+@9dd#=K5y) z=E$uNdy+dkIxsFg1h0+le@h#nfwZrJXuDEm<%ArWh1Op=EJuPKFUEv4qQkJp*E%~P zkoIGsHIU3(H2>rasnSzULN3GAOyv+Ps=EWN4X0PRY7(JW!o45AUlVB5nb!n17#<35 zHp1GfT-OvnwllE*G&jZ|fwu|`Xy^rk+Jmsir@XS$ z-_rOu0NV$FOZ9ZPzu?}Rf+17~My?7)Nk)S_joRyE-)01zJ!hcN&XC9#bYtM;_9<_4 z45kJuRs*~aZ}62_o@we(m?cIq@}Or3yx1a>-tv9H$n&24@PoA~NJ-^`pmMUM!*$~b zNC(nBt*Ua3XaBvVLR z1C1=SYEWIxw_rg-T3evyM^|$b^lAF#*1pVG)~@N-nB+#<^p-o?I;>EIes=Dy_{mqEW(O46g%D;j?4<-`=0( z&jrZUTnq0>he@89-LRPQX>ILJ#oy1(;^CX>%W$=f6KcGYUHT2C@N}&&(gP`KCx1qq z^0`im3b!X?dYl=rd{2A%v*VTTYcD@4Uil<@`E%lxA7n2-JYM-B_VOd*l^<#^?~YgA zZ7)AEUU`qbyeD4yWP5q4jXNz*yh7-)Gxq|jPn$BSDUiZhR6*F;Bh}{dl!sh2N*JTA z&7ex()zZjxQ@xLhzbTXIeJMPFg6ub!e`*B6DKX10E4Om_E544G^8a*n zut+es@W&?Cow?~0tz&rv%A|%x3O`5QdL{e#QF9aSr}}^FDpU?s<3zw_`Wvpb)qm{g zjt-hY4e<$7-qzAgBz3q^XU_U@tJBr|B2YhWb-S9M2I1QBQQx{=KW_E9TK1TNUn$O)sfufAGdaMH9!0-x){bZ6~=IEAUuw00@~A*dEPv= z>D=BvE*hcD$!T*^Dn6|(sPJYssPN`hR$AMTM%u*1+8xx@@h$LOR=QyRW!o{J7lW#K zphnKZlAt0~E&(5LYhYrNlq;%WL%&GlK$ z^|0ppu}1Yn=ZtGU0~FVM2`H{*2PkesH}}L^NEVMjfa17^K&3I>6QFi5>UqueWl%dA zZyzW=Lw67qmpBQEck#V5F<0lNuDBB6bKSec1Nan;yt9cobjVFR-1E278+mSJLaHf~ zCS}mmKTI-wVrW;#U}CoSNB^IuanQF4pV6_OZb@wF`BkRu7^y|Sk}0OS2p(nXesM2o ze9WoQ8kG%-mJ?ynp$1#b5~1%rNFA-i^9a5N7^tL$5%37AVO*@jeBl8WB zvpZw}N{hCP*BT>bl5gXzDc@V}*P)x@SX z;DpD~YsU=b{{2YjpWb!JjA(f`JOB;9pWw#u%VRSa6pzg^K_yDm)NtOJ zYn{^CivCjfTf5bQDaknd;+%@pfm4zmg5jwLX?4IKyrE)LPh7JYH8QcAl$cJEx&*m$ z9Pv3tVdWB}_dplADKrjgWN)X``%{;cIIABEjVfi<%JmO|1eYSzIvxe^RR7IkF9IL> zaW#g7y}s<(7KZ z_E^|G#AS}-M)BA4jy}UskBdR@yyFz*&O*jZa3)Aj3IvWCeq-0^xN-?jkwg{aojIl_ z=C`Iwy^i$QpIGZ$=t$|t!qA2^H-}(_A&1j7eVihFOBrwE5T`Wc`zcb-9ocxsl0_j! zIn1$SH=G&-ic1mdD^em3?oLtW6gg1|<~d9tRj(Pt(c~A`OFHR867{gty9$mDDWQ8e zsr!U(DTJ(0;kZ-P$Wx9}6cQ?PnnW!gq#1M(2fb?J5}YE5X2#UDyv`>*@J^)|wlI;84hr}t(!YO!SL5>Vl|U&LI=7fw+; z?qoa`%P^0nDnYIsN3rA-#ga=9irz1%hn?it+G`{uH;^ zt;k(ly{dAl8#^Ime`mM054M~AFs&ZHRFW7vrwprjD%{~3IN)zLl`AS^2>y@odMm!7 zlGZCNGOOnx>}~9>sKci8b#B_d-o3mA0j{mBEUTk%)$>1xVDS-cFltp>g|$)cGJvoV z75=hf3cMA&3|pPJ#kY0ta`Dl;B^Ao?1!$e>sDdSR$GLIXM9Qiaf10Xrn*jKHRQ!d7 zf5#_*;m4k@j@xB9XMtG+U9N({0D zcSXapWvjJVS)er;2A~PEsH`G+2_%LTuXK}8qpJ0MSD=w|8S=3M;US3(x$_tBt zMalA-Qnu}w<_YcM&H{#CWopdwnx!>$`0;hQ9%)woOL_U%Bfu@Pv}$QX{Su>=DQ=sZ zz@N>mhJQ9oI&4v)96y8Av%lw|GBMUXRw**ePJlkrL|eDRNY$O&MafsqRE#0;x=uwIQ!oR)?3k&8kF= zYqbQPVX8-Qfe@h>xXR_M_NUO%>QojA`te|O6@Kq!>xcSR6cz#c6uTNfW&JIhMS4e- zfO8;D2hPDbPse!%&LKF@#CaA@dN(l?=O~=#;2ef?IL;9`-8e_$^x#}N>+{Mx-@0X7 zpS<<$y*_$A>zUevU(9`Z(zCfY|MHgO+m0#UH+=Dz*XCR~VBFOs-`IKM{qKD7j|Un? z&h(wN@xe7uHa@=o-rw}xwENqGTNZ3zdFg%f7gvw`%QcTxUVP>Qhx`3);CELi9ocYJ zhU?DjeFq-D;)-AIntJ)62Uq^L*ZRpD&dCkb4IW*3AorZPk6(P<#E;)wF}HZ|iC_P5 zU)h4bqZbZ3{krgv38#%O|7rHMDN6Z+L;iDCkIPSVJ30BKM;kx-CT;##tDbT`?HN}d zzA^W{nctu7shpDi&4ue0A5Z@7z8~K15xg~j`-sVDD{gx6#_`^ynxy`3j=T7tFYBJ} z|K!F$9Nv8R_Rs%$`qKwDd+vO+<Zsnu1-@bLywmXxrz3V{so{PfWu3x|IqOE}~@3dtVyta5- z+J!Hv^27gfN%#I0*ACm){qn4-52W01#j>$qZu-+3&;8@|n}SoHc&GQx&kX)#!h^N9 zs`&g(+b3L{dfOWH`TpJ)jJW2+LSgVO64KfCa&vcQ-TTco2k z1A?Q*9Xi(W!ddTRoqYOx|J=_W3=TPSz}$U9%AQUb>t6T3wP~N<_uCUk&K$Mm)6@%B z-CtMQC)e4yvhT(Bb}M>n;mM{|_r8(#`EPDox#`sKzkkqHzvsu%OE$jT`?J^n_1DbX zE`53L3+rFVNWCrdwTjSRKY#Jbq+8$k<?O0S*$@zcM%?3%zyX1-pl^|^sv^?PkZvk=FA@+|9aE3 ze|w(1zhUmv9e;Z7{4Z-)x7>I7jbCT2d}h$Pzb$gCdFTDsfp=6^=HwjzXUo~wmi&4B zWBp#uX;u1F6zn`vc9!?4+WJNNPLpPx`tqlePd<6+x0mg^?d|Ia$#347GyI#@bBi8$ zeCXZ-C2Q|an>6Qx&j;<^Tl~PqcUbIubh?)+rm z+tVf$Ts$xJks0gqPMi8|8pSipry3$bR=d#mg zMq_A*g$Jv!%IA?qmCohV#Ac|8P#aW|q+`_L7QJkj*$0@0pZGw}iao!RfhsOCr zaC&Q;Uj#?eI7taAOVv!vf%u_vXkD?HGb@U7WfW&^6z9Gu4!u7zYkoe8vpb6Omf&=k z+{~8nu2XROXq*ng>8o-2^K6s)X`JDL(^KQn;x#&YX`CFv>7j9G9XmhN^r<#+Ji($= z8phK><+Qs5&SaHCw$C^;OTZ4Y`R>v61oUnKS3k-}NJ)Zc{^!QN!ZFebk!Mh-1rzu)oU z(e9dGyMz?OnEV=M^6P=yWq}2R+ zVB_KM`)FynT1YXB$**%ve)%5x(=1);E+NG*Cciu;ztWB+UfWmm3x>=NhB5hduF0?G zzIU9VOT8+j7{=t+c}$9zR!REDo=9(9>LVe=Febl7oBYc2UDc#Zof1+EWAZDRNvZiY zclfMFbg2QNI%OD>Ut>&uop^88R$Xe0kYX5E|Emv6z{8r9>SQV zs7vEWpgf}Eh5N5B)}>H^v4b#XsSI!&36w{4{Bcq1ui#hL9qRSqjmBlp3!+FFkULF4aev17XZk7c(gu(a_Oz^w_<+R6s}( z#w;}*97h7RBXm4J;`0x5sVX5w7_*cY90&jA9MtRk-}sF#wLwS`#w_JCN!@eXko~$8 ztums6FlMPNa2yHLC#2(p+vV4FsV{^SVa!t5;PAd5N%gw!GnX!vM8i-VgfUC`!Eq!| z?~abAUOj3^!*n4<7_(FW97h5?V8_+tC&TEviKoki6k*I#Ip8=F`U{-HcVSSMx<*J5 z#w?Y~q*Uv@X05kIm)ant2xFF#nUrdWYyZ;^6@VJTcZ3vS%u;zwidr8!p8Ps-tu8gF zH|G+@EQNxBcu}8_j)L0CkSdXjXES@Z*-gB10~>3H|_Qz*DPga( zUA=9iF6HXWxr8xG%?8JjFp4`%{jWLp4_zu-ND;;?HHS&Lh18Fpz&>4SrH~?wS!ynm z8Z4ytZ`)d?OZ`Jg5ymVvk4dQ(wJi6Z@w(JoLW(eEsY{rY>era}?*>Fo!=Hr|Va!sO zGO6LX(s5+PkwEVa!tV!Eq#<$DO6me}4jbr1~{mND;;?g(e?T)XLNGWS^!M zUFv2bMHsWxW#Bjx#*hdO<>b(hbg4Z;iZEuW1>op&rzeKI@R}~=6xAeQ%u+B`NKsj! zBioyHr!JK#qzGe{S_lrGs{|pPUo~j7F112P5ymV9Q-G9O_hxN;ZM!b@n2;ijS!xlJ znuseM53Rk|&^mk}qzGe{DhJ1rK>ZLpO8+_m6{?zF9v9~l#w=9$%seq6o438`RvZ5VkJ=IK)>iqG!e@9}d>C-CM zgfUB9Zj$4$IA{Td^r2m>j@zl)YLsagkarXvK2($eZ>wWU~U5-h{^4s5p@&dO#x zy&INN2q<>&VXJhaUGPJB8>Zp!@tR*)y~6faj%TMzwl@L`*j#r-DGsK!0;?m!c5J!-L$tBe{yl{%zml3gv;>FtT@qgN&QjZW11YZRcV+%2!3prT` zwzdbTVUMSB;}%bBKd5qRwo&wHO^%4TST96eS|*akR<_iukLp?)dd5GyE0@!Hf|=^Z zOvGJmT9iZ_EZbt6Jn?lS#3?P!ohg?sufWfrvX@lS_N}G$l~_$x9bR2pP7Ew7skx%M zQt~t`rxv&CAu9Gh;7wQ@OjqAk|SHAXDT z8jUfGb`+w~CM(2j9E6B%-U}&vH#J%9UDf2ZcjdAZJoc_!HkPXhu)ST15XW#7q88&7 zGFC1RV~WSh=b?+{tLb5nPmR)J2#m4l7(!!W8-rtVFowtEU<{DSLCqTqsmVbE$-eZ8 zfW>eWqR~ZMh}k#@k?1-=h(tR~pI(~nEltTT_7?bp#d2Yw$cs8-dfN1fVp;0+iEMS) z^oe|7+VqKRWvW+F1w-DPoPw;vpkG!6`MR{}6T>yrC#q{ybuF5t-{%b$h6=KaLs|c$ zWOk0XI5!AiWuKiSBFUOWJ3q6%a*pf^%6XcfSR*xkB45mkJ65w!pNJJwh$dUls)aVY z(Cg35FUT#<_1pPLt6Cv5eWJRqb^1hIG~mq%r%yDBYLZ!5-dwpbtEf0H09mTD4#d0uprx?UEmie(P;X!bxe*|_GS4)S%p3`Ml`b;Fyzh3%E~G7=jIZwkQ!pX ztXM-7dvmjM^9yBvkP!NET@3(l^FsbSUv|E2%3-~vZg_0bt0tKpKp_hRg1H4jyENzP z>tKYm=9gK7E?MBsFUZgF=Lc;|88;zaE?lWeW)*nlTz^&`i!V~xX1T8sn_rw2%+D=S zQ_+gXf><3L^oIO?xiFNQLn&oyIrU}1I^6Hg%PT@*_p@xAX{ac%5?6;6d2{^*GOWHx z;xn9eHL(#~><JC3F4M_6W?jbT&CU<{@`?)rv4Wp;J^ zAU7yy@fwiFL0bT=qo`ib^`p|#Q-?J^Vo|gXEcWL3vXDOo1$tQR7D{Up*}2}_!cZVo zWMB03X3C$E|i}iw5^17Q7o%wvbv}FsFiYy^JG+lqER(g->jxkmsYbn zLz6@T6orZl3kzhe$?!4Vw9=ZY26d_R^oeYZv@YoL7R$w<0y&4J47KBY5jFJlweQp> zU)g{`LM0R}(gXt`G&OQ=C^uINt11|nX_jd~1vfWWlSF-(?GFaBgQ%ZHEcr5LQ*$cT zMpJNfNiv_pB42(ED>xL`cqI$qCu)*lurMA!!%H+j0|9R^x6tPcWoN6BtOvlBNwZ3q zc1M~%v0Cj1lxw2scI4(1`t$Q_dmU=+t)`lxG0x8O<`-pU%f7rE)lZ`xSS159H81^z z-kfY7@>9zcqaa^HjXnooL_K}tN=-1U*jwb6QQ`55hLTntU5oyWVFk6*cJRf zL3lo4f(bSuT{w#{A+$IUwkm0STAJHpeT)p631fYWXtDROuQm}gQL zOrnVBGL3*i;gJ#C<^pQWqF`-I(sn8KCd{4n`GB95W zTpv8!>7)7W`MBId1P+=Iv%}Sc|0pn{D1mTLcG%(YWvrABOcA}Z#&J4MJ6sL;=VLbb z_c-aG*+Dy8fAIea%yV7fC|&mn3`lm^>7)EO2;6;QdKs^7Z2hHq^LK!mOfR-^#7Y+z z+~xvPC2+CwV+L@wz-$w^Sm~Dx+!w%{CZ>sF;fjEp0?fKDa1_nQfcZk;Vx{x52>7qS zJbf_)aKy4xnn_KZj?aW~(h)0s`EdIKFrNxstaK>_?rUHQy&!PJN@tohzQQX>SK*{1 zmOgq9)#AmTD>&(hg(HLevlnL;p<v7T%E57H#Z38ebcY(VJxWm9K36i$h`}f@lw?}}PR>)vdB5ro!BmQz=>IE)V z`ce7#9Wc*!ftw2jTY(u;%>AW$$O%C17I9Rpev=yk>RpaLLN&)x zH^xri2Joj{ftC9>>4?>C{TFT*Adq90F&Msru-8Y`=s$otA#kzmihg07v>fHKhU;^6 zqVFkS{v&X)^xX~lGixR3ah!C-DsK{t#xcnEAFE>HGyS4=qnq%Q>+zrb~-uLzh+yU>>eeXD?3CvctVyA_!G1TI$iC_kPD<}EAE#$HYU z^Q#qSvA-nf8+r@sHk@>5{@Uov2WE~HXQM9+OtZjs7T+6z`9mD~HUYCM4t)oJ`JfAZ zl)t|KlXNSKuGCrh&I0Br=e{5Sy22UeUV zd_yU|zzn&K$5)GojlN01WLa?*ePn+Nfmvn6+333ym_J)_7JZa{ZNR)`#o6dP0nD#f zoJAkA=i6b=IO*stzWKn+vEnTHsJ;pd3{!|ptoo%9xbr9y$$YlYSmxQmi-|eMP`5vf^y?H3GBVinG!8cVJ$$;%xN22h33` z&Z3X!^eq5pxfN#dj^mV&$(JxC;a} zR(??U^5fJu1Goio=vxz~zGmQV?m{2g%Oi2>dl9%jUFf6odlZ;otT>zUcGkVHXPk7z zNRSZd@-FmI{;rQx-|fI{h(q6taq4>oxC342qx?M%jB^7| zJ1t#o@^=(4U#{h=ey8H_0>CZ>iZ116J6+|_$ED|#+2V<#dipB9)XROA5?y`fSDt3o#n?uV3rD; z19Hq?i@i|!xB-|y3tVUV9tLKUz&T>*qxilpFd*3xE5089_eB@_D84-(#GEWnIy8T6 z%EuI7a;!K@e94|GfC*c1Hu`P_<~}RVM&I)S!vcs)toXhL+@U!1{Rm8Vdf|ejv;0T` zW~jhv>0${V<;N6(VG41H6}~LsisI0>G){eC;2OKoNA>A_z-$q?&f>cRnEhSoBYXZD znC^e&vDMPWCVxG^q*!s5^do&mz*JdrHu{=@x!H=d=p*}k1eh1CI2(QM0dv%fv(eZ6 zAFU8*B`_-2o8NUz)i`kU z-ua6-aASZQ{5M<-hh02qJ;}v!;7Few2d+PGSH^)OJGdqe+-Tr#ivvgLw*W&qT(TAqY2(sM7By5atteShf8mPM^t20C zO-jG8K3o>AE-$ICD`)6&71ebmGq7_&S$$;*bf--yrH{sIR*tJ#bU8LSnKnRLL_3TP zltxS6Tuc84<@dts^17P(nyRondBzz0;5}Tutopa~>-TJY%z`}`>X2}3PdJ~lHK6Pd zD(_%dI=|B9Qx4=QuVQcMqllT5wp)&5_oVH9@7Str<(q3!eZ+TQWC~K&ZtJ-Jmkvlb z{oKoSJ#`A?@@?1wjO3Nu*V0XPywUOT7U>#nbCF;%R1Z;F6?)f>}{l=fpU}fK&!7C-;z@Vw&6^5+c|yfwl)Ml zW&ZX})N9~mOw7%sG@fHPK$BnzPU&1w3RF9!R#3-qIwhJ)8^m0xZL)JagcGwK&m zcQA_fg6kXH$`^UcDUk|!%5mgi$6)W-m^4vn_rV5j?>=pt&rPSW zUut_LHY!{NnA|$c34m|j_V6&aL{AV}Z2uJL<3lwHYR z{b8!F|!<+RNA7lLfKB6(k+ygrJg0S686+0%R;5wsSAVu?;_F0fT9gC zoopYW3m7j8Jf5T>&Gl|jMMwfCn|YYPa1U!Zn`BAJQ%>e7#|mNX*mhkx%z_B}Z>H>M znvRXB*Fjv#b!O7$g$=_r_vLU8Dlf~*LByPK+jBCznKAj%m{FMy!knY&IWG!BzSGaE z4XTOtUxcIS>Stx3&A+Sf1xsc5e9+InBlW*x%OUryXV8*i=1PAVqm=x+)}vXQ>f3yYWB?p!tEP zk1E!5b-ENDt3I(3+J0`+)kCH5=_<47YL67|sXlQ?H*7ZvBY~kU^~hu-Au89U+dW8^ zB}gu(BW7HB*lnqX{=~w}y)`J&h6it~FGU{niGNV2M^(jvLvl!2t807}_ zZ${A{!#6XEboIvRWVPc~#;e5hen!=S+Qq2ff+D_Cx)#?8Mp3!WW7J=8C0#}}e6F}`^JhlVsX10T3xHRnmZDE<;oxH>To8cn1ccr## z<#fIsXGZkamuFJ}WIJ7Y5vcRo=A8q8&X5{OAT^arzYPc#^Gp`oQ8R6c z#O4C37-P|{peZa1xA%fyJcY>Aw&Qf7S0qXIGioBP+;u7_?wSwk73O*gu5Kqul!N+# z@v3p%!KhWZ4r8v@g5s{!#5~AcshvNIxjwGBQU{UCQj5?1C3E6?)*b?N0;f~@SaYQ) zKfrijZe{prkC_PS#J|627JF2aFO1Bg!;<5kW(rTY5tv z){^hrSzuW>n=;eSf)lp3bv17Qp(HLv4VCup5GI-Ea@$$ti_!y_|bqz7-wujmSjTOHLo#N!egU!hnAEkpT^c5Q>!-g^SAQ zaJ7tToj)W7vkjI!*alhIr$5UbM+QQC3=7DaptvtoQ}M1Djlp@>tSM857gBh5Q)ZA6 zgXLD9E|CO{^7Y&f>tI?Er9K)(VLXTVL1uX#qo^ugdy4kJSUFne(WNN3Uh3;>I@J*# zEw?%&NP|VAz;w_ECV9IbeLGQ~Io0}%Wp(oQ(}Z8VzTmN#3|@ccS2idf3*E5wY}`UY z*0M23U08Glcj>8g4DRf2`_zATvdu(KF)FCM=bP=DBd`6E>Jqb^go4Ub9;z_%BJ+>t zMXorKr{Gq9NLIcTUgt%w+Fuwc-xX9oE{t5&me)G-?n31hHzw-5$*eu{qn8v!8Co+%ctSqC^soT9r8t-o}f~J0YuAJ;a=dS|8yu4fY`&Hbqv`N z?gMVdSX7I?NRJ@YEh%jIk%>?9jeXe{=}tv2q!qojJ1CEQ3w)Ptr^bbsy*Z$G*=qpx z5l$x!b|o5=Ii&-*a#JD;;M7Gh*u%{AAyB-us!jJ{*83K@%cIG9@E03;@EO#DPf0t# zosnrHe?%<0h0mgndJ3xfHrM>N?_3Lb(L$M>zx_K`lHutLc>XC10L=#?9}&>mxCWS| zmxG$j%NOb|wW(1nEEE>BD=DlR(+pll`$Cmfie7J}Q@urdi?cd|YJ>NgKmY&MiM-xT zJ0RLG>Pu524Lj#9Te{;(IMQ4scl6GlE4ME7JdQ$2hGQ(Gf$3=0OxcCa)TwSqwj^!A zU36ED{TW$}w2M6Dc??X9ns)}yNG57P;Ot0XDzytx@B1yzUefb<6j6HaP$xrX)&bZO;n;VYMds8vdteGy{JLPOPLBM{0iM7-Sr zwqGgilXgG}xO`)G`;|Zs-`F-xL8Q=(L?lQ9Sr$vGn$#fhe36yH>4xII4*1f`Sj)f* zI|47Es)WHz$CX>hQc%2BUk&Oj=6VmV#mI4|^iPf22I^DhN+sdnj7k88^ZJA0RmNyg zyrP({Q8Ys3y!oI$X0j_m@oI#|lKU8sW`?-yJ)n39J^=MRb3Fk{t8UhQ*$Af5mi?Yu zKF3BQTuis2q@xNq)H4fdfN~o8@XD}NJs^uN*0?Iy2tTP&hxKQJ+i<-7bS5hjm(*~w zQ~eDa1fFI%h9V52rA9-l<`RuaT+L{>B{}jutM4~&Kv-QbWrjwnhFaCqw(8u*=e`6e zpTM+&tbJ$A+{eSW8v6s{)j@*H%>BjNVbXy!wSW-JQZjYg*VhZ)*8x7BO)}Pb(wi_ zp|0N}IGvIYS8l+wKxHCAPN^Ey!^|~|D-{%{bQ7*z;`g9-Gv42D<>US*K)uCydb@fE z&wCiJ9oKTExf`xjc$`u%T)Dr4Kye%uFpi@Q^EfV`;i&7*afIPGnzrG%wHl75Z8`3K z4fl+Ods)N12kIaT-^6ZeBbW{99mWfR68&{P6o;v@o?6rhi@K*Yv~)^regHj8)+BF% zdSi>Vg+WxuUS>zp)={%g6T(C0pa-3j_O7fP3o2W|O-9X3W0uXwFu~|=EfCXya`|y8 zb~{O#@-_|Xy|Uv#Yk@lR&WH9W@`HiExJ>O>AEOQ#1`DF}VrbDOlYV)3O>3f7&I^C^M(tyM+IFAb^E>x z5!B;2ol+3jKQoF-{TXPQoKhvI9~iG5*9RFz-9J7T@Bk<-ONLHQPU%Tpxk+vYwVm;H z;d(!#-o}-?z6XlCeg=vX-^p5tml^dlt~(fYIxK+COHjSd!!iccUzjW9C-1{yut~H0 z;7amjHi74AIf93^9S$$X-zyC@Hk$WIqQl90dt8c5AW;7@=t-wJ1Dv}tm5`V*1``>s z0sXwVtJPG~b3I|%hIw1nLHKsD9AWiWdzm^vIUq`8ZHE&93%_hPPbnrf&pF{r8Z7(; z*^h#P=}f8_>0p(=>N6tMQ>6`EQ|ig@#_5z&aiv6eN;ItJ^Bv`&cy?T&QIyeq!nPSy z36k0=tp`Qbv{U+{h9hI(vQ+LaW3H5qM{qi&y||KVPu7TY+$VzPlxX^g^C&|(?pIKw zn3nFiE@aecxL(RA8VsLsUGN6ZZIN533Xf1fojU80wN%-QIsxS@o#!W}^wUv+s}poI zJRS!xct3p_C|*TrLlc&oNX33gMe5eiKL(7L*X<38hv;ljT8J{_$^9rZ8h+>7lmv&C z1HRVKx8W(W!X}Bx74Ar{i0DH+E z!0;r!2-G(?ol+LAKO${-+2&>EO3if*s8h`KI#ArT>E{ktGvzzIK*f8sM3Cyd4yu*I zzNV8M;n^as4TXn|*|zi~u;?qHd7egXbUHexG*-_*ex&%v?hyr#qJ@l=s9scSt{`fz zwAZ**N&=v0P|*s_N|AZtm`?6e$!uPHR0 zgARcoJ}0~GV0Sl~CAl^9s|ZNb4tYD3mgjL|?1U=D@Pd)r2RCLkn!a=wD#w*CFk8`b zz}37K*v)-$;W{?c)Q&puz$cqdYxsN%rc{Madn6(X4yR-)F63Uiu0ZU-stG^h*;8YPP>Pb4K z5{*}_Q8fPGuGEd9-l|igR)AB~+E7cvs~%2$f#=5!Vl6SWR$Bp1RG|k^yCW7-^5;r|Eyem49imFgswQur>W z-IT&NF%ne*2Qe7kCkCUG&bEWmV=K{gVxXhF(W41ho@!0kgd|rp^%2rAf$(86CF?dGwuX*#`#iU!Bc($o1?q%eys6dakYCwum`Hf8mhx2% zl2RPPWW|RlSrXXXFQxDsdFM7NV~F|ZEavTq`6q}u>WUQmSX0*;mcTr6>bmQE&nH0<&-w6V*OucWc%%~%iT3_v8a~W;?du+J z`Ck!={C(OC(epi@0tJDz4nE^C`IQHK_39#so+Yt%+H?gG#M$LFt0|mu){CBp=lkg5oc+ zXM^G|v8k#29;cJN1>()@=XmDSBqZoz=2{Jkw;HQJ@i)OuplBrKlwQL1Q-BJgiU zoeqloHWt)Zj8_VZYq<{;mpBTFOE^%a@URqs;vp#0s0Tptu>1=Y*YYhWbz)==do_Xr zj1?fKP%)s5XU!wlR-gs^5*)8E@IAZD{3|Py zH@ayKh^;$8`NCvd8w-XjnWUSr)JhCqHOx^BqiVZkBEmpZdR)zSe%A%B_*?V4Md=s; z7>^Cbi_c5X0>wkVOrsh=@%ih!LGc)R(P*I?ve4L6u?#(hj-!_sZ{(*RPcrp(f>DKB zybeKIlc*MQwe}p&%KAX9tRtb#uS2XY4a~#Z)QHz1{}<|6+2cF8ymJxTqwM$?XkWN6eO;{}|0U%UXdfZ_${9*v?t11~^>QCxWeqG5?` z|B{&&3_B4*#%?mY(c$jYSH_eSO=}l6@p`C()+F$E4K#8QCGGz~Pq`QT=dtsFI)u|H z)#1wf$24LW6#!XGtvSF5zYpgrYLhRNC$pbKxmux>LArfO{|E#N?dw}hD* z&2V^W3EskZ>@BKq^Z(Y~{#W%j_J-KvrQ+_fusZ7RpyEqAFcwiHlcP%8ww0$|F3Kal z!;VfZJ&(pCKX|22V>RBy__aJ*4vO37R#4nNDMvX)y;g3YG$7~pNh`2;{<6V}c>9eP zH+w`5(!_Fjh$u9&vY#8CI#i`7%W6iSda8zNSM~@PdC{&$*(H+_d?2 zv@GZ=9e$}N?%^zY@8ey!gm|s;I@bX2%{VvUd<MtSZIC+gqbCxWgE z)Y)|mui5C3f;t_pPH7aVy-dYeT!$eMnKE_ZVAGCdCeR&@PcWEEgK4t{JTj<|Ci6L` z+qWs(sHx%=&Tb~gv_QL{aV_QV%EI{9PX1cH;JYa1E zMUBOWl95~FS)l%k(iiAGg}`U$5~`Yoo~a4fl8f z+OKOL)3my;#0FY;(Z9N<1g`d?|7d$69(!Ncw0e*vnnQhnhSGCh9$$B47+e`v0Q^g= z068lHGS~wiDIPGzVr<5Lf>0`;u3_b6wB|c8bFRhYT!aZ=a`R_Z;g0F9VzurJ%2d zUck}2P?b${U~)53;A}tNgtkB(%*%A>nHI_JOEsA`FGC#|n97bNrN-GA8jtfDYXc~r z$5b{s^%^K%W8IDXRXd`{V6QoEQ((l@xpa$yz*A3jp_oGyM=h!}YbG2cZ22bzIz{X0 zH|_AwXG`aJ6L}s2bPy+BVf{X%@^R(VY*0rS&upe@z|-&{!6AH9;M;;8cH6T%C4UdyX0MY%2wahJ$_g4 zjj4O`T!n3UOZaK)8xcSC^e>A04qDHd!j_3Z-gc| z10&??fQ%B(tcDD0z@f(g|xZ+0r3-KBS8k1?1fNb1F>M^N?SFE$I z$Mlk#Z*QjU4k}{6j-@F2I(+S&N?O~oJ}?qxu9MGkDXsvPG?6w{$8j`e4I`uGK=YKn z903ix5hyHUhySied$hD&jd%IzY~{5E5?s&7Sc>I!uIugVXmdRi`i0ray5GPd^dCWY z1O2O@vB(3GO0iRJ+U9gU>XOm7N%2qJy5<=LNlgXai!`S>+93Rt{PgaKMx%ZTawv$) zJRT|p&yWrxsPry*m@y`SmX3xVf+1>Mya+Q5StfgA2f!uVmx#1re&xNFZh*85qeZ^d9R+hV_g8CbC-3jUoM!l)==*1s* zJqqeLlRX9MJ4XEqifieICP@?>Hp@0kHRj_mW}3?|88aGl)bCjD8AQ6)qCyDwMtv<^ z=U0AgzmRHgAKE@At)M_zpcjNUi;Bu+GbpH}%NpL+wENLR~e&_okU zkA*;>#Gsgb9|`=zzTSb2KP49F?F>A14ghf7glS>^MF^bH^$G04{VklI3Tuo64$;gp zZ=oUqVcIYU_8m_E!{r2&2C@j01^@>`ucXPcZ&A)Op@Cv(7AEb@P$aM)Q+bbZ!Kz3i zMF;Ql?aR+y=-X_Tl2G+T9`?{n3ob^lI9uU+aPqlJ#!zZB;=%CxaC3h=`;{XcjkP9z z&qCB%udzj@aykEKDySSq@pCm(MgEG{fwC0ztU^&($h#GgSwpMvDm<%#k!6j{g!7cw zWVTeuFq~L{_-?Ive@wN_z;iHv7 z0lt236>12dx)ew0fhJ=Oiuh4wo1E)x=;wQZ9%xwi!~%=5u}07Eo1KS{=VV5l!? zK}BPFViHn$h2wQ1CgPb?8i{Z&!zziq!&kbKSF-6`CeCDZ9U;zSw?Yzg$JLOggNesN zl#VXhzQZrX_yqep816!Nz3g$;(ckU~WnDO=ldS8nq*zEBST_oi@G${W7&9o3;;eNG zr1uzCp>Pi=-5Mp)l5Q$~AqG8tHi@Obu@{zu(5u9iGd(Uqx=_OjNi6d|1WC+`zknpJ zx__0p5aS;u^#|`&&PxI$VQ(^|2At;%NFvW(Na8`FTOhqJau4ZOmY#+raKVA&K%Xh4d!t zRzVuib@d9QX)JvPNlePa>zXqL^>l|5V=0*C5*zL&;z~iy`7xGVPh(`H+xNy)6iG(o zkliJ56suj;(=Mv7L21T2_W*)Ln;NQ$kUq8zFthxkN=u;2t;Y9NhNb$e< zI13)J2v%- zj3kvhUP)A$A}p7ZgkOm9AM9yZ2;m2g#B(e(#T8GlP{97gso!8P9*sB+Npv7uNa7-> z5>Sj`%5Ob|ak1i*;TaB^-UuiCAc-d|u2D|J-H5VH`~VS6aIg9Q<`UCN>xm#y(|AV4 zd{iivGJ}l*+zEXsJxzpjfm1vNDLVujDy~9*43d`HWq{d(=W-D|xJARkLoH|B4iRA# z!S8h15^4sNoiq@66LmELlBg@{H=;qzrVcaGpgWFVh%p^|(dhY73gZ_Ngl-jdqNlw8 zNj%}RSK>nWrAiST)aXL`i&F6m;dfJojsihG!y`hP;^2RaYyUtH(N-f6aEW6d*f6L0 z7{TYHi7=`W%Wr5locwVmi?yscv{NPtcrDpJC&s-sYA&~{`(aEY6X_O798UeRabYi- zZ^qL|C~jNZX8<&{G*8K8I}7dWB=N|F7`jU#iJ^NbBx|t3b1~-YdYh>KiuiMEJhrI` zj}RabE~1zuM>9SGG5jlvqQ-qPF<3LmJ=ReHRSz@{^E;;aEsxm6Wce z*-E03Q{ed8)Jty$8H;z&#i+L_U54WLy}Fyl{ju#ka1_3H2O_9z8F}D0k&oah9{F}D z=KNS!-cdS?nm7o5u?WlZ^1;%^H8AE=WQ4~lk)uA8|EA(dK4W%}x-g?Rr2aSyhZuDB z5vk@1HQn0zSl-nsi7o3%tHnVj?Kc6qK-TePa+#Pf5j=8b7-xmlm?QFX16OHf=E5&a zJ6cKSp$4s{J&j+8(L?G&jG>Uk^6yAUVp*3u^Ev#)8oRI5IwQ3fg9>Jx=AhEmT<-UI z_|)W(V~VK{Fr=7CD4rZ2C}W~OQ>PQsXiCK|#F(sfPFif{dy3~#1J>)#j`E|x(1{I; zINxL3MC{(N4Jy1RFbNm1uR#=7Rdp&yg>X&bntT-X*{Q_JLG@n6uRhlUW2)ipZQg(Z zB2x8g`M4iEp<7}Sat@wQ$CzG-r-x}$fQOH^#T-%V0pjK-Il`0&Yk4@&(&!Y83>kFp z!W@YHk3yKBOR_<{D}Na!Q@5bTgn8R@B$qq zaR#8vF>wYk*Qa@H`W%+?!jNQd`}nPRDjP+@d5nY4 zhA0|mN~^1}cPyz4rPZc&=o6JA{~1=sx&p#i_J?e^9Iutr=xVrpcP*y>J;4X7v7)nM z6J5Qzw|yUxJ!G3>(J(Nw%l-;-l*d5Yy?7q%!I^O~3Ws8n;5*1;K-m^b!)ix3QhbYf znBzy#@nEq)oNR#<9`hWF8bDO~e;etHa5JS!43Q;G%^@H@=4@g`f12I7%jV;mw^n8I zBlwzKJnl&a5_L?EN=UD(U|k*Div!N?$qYzwj*VZ#qybY4*MM&2cDz|$ud#CSi2=jvs-F06|7WP-)`v4BT>%&(oIjODVrrNxeyiXJg$QCd2(YzbFoq8L{EMI z$$r^KgFD`SpPCz%;~Z~q6_t|*EJkYRXx^2>N-UDn^LIFp`4X^txfL%ICp7muT=Ef` zt&T+zU}=Gj6(w#Mb47{o5$4FD2ZfYl4_1^^3Tsi(hA$xp1BMqXlZ7-|e)GgX9A8YgHt&t-%cviEKYH>WED3Cr%}cACOzBEK>DD;ELd|G`QaVx+ zh4DDtuy)6Fe{B_NG!Ac=C&qPudNt&#uy|idRJ<>%E7_u+N&g?jqQepKvdpCWaoLZT zWhN~>hcQBQmLOp!h%KBv8%6^&z1HDavXYx}8upb-a1*h*>>NI__5lFq$m}bZ1M;rw z;~rqT;u-c~)yT-~@a(vXEo&%C(-0_>7FAsx?>ixr+dDQcrc_*4cw77S#5*>Ax9!Vt zSLse8YSrIy!CzK|kP0?lBUEX1UE~K(!R`_{_H9Ksw2eF>-LYsYvR1Z*R<#jq%M;dME{y7-7{*xHq~tc4fowe48CKlj^~oSnV%5#U6W@HotyVEE(Tun^-@k~ZvhSVVaCh0cXvd-( zf#EZZW6@lQCzG)&t-caX>R56$WJme6*dxxs8%AqKjwRipFe5ea9AeQYjzytB4Stkn z1dj6an2FdY1TD?zKqDa*33T!UV0da^omp+E8ZqkhekgHh1+_)Lp&#Rb}Vv&2K>Kuc;zd zWGC2z=XY(r$j)x)s@`SNe{hxkTW`L6gQRlF@1h8fCA6w6P6t0gLgeD4Tt#74wq*_~ z3W5Ii89Ft%OOo8a#Z#f;YcA9aT@MwCveKwKhigbmR!;tb9m>H|H^c>Hlk4>4=a8sr9TWGWgYO2N zya_Ki@(f$xUQ@Uu77l|vz0fF65fgdr7w{#3t6A$f9N2@@nzdey6gg|{4beO?A*XUG zda{+>P=i_x{fw}ZhE6~OxsW@g5m>0Y`F_QFp*h> zgH0b@Evt!cP%ni>^k>`=L~ZeWji+!f-@lF~NefEqmd&RJz4$2sZFYw2#QC<0Af^$C z!^(FEgCZ^k#YBxQOAD9}^J_Z3gE*&%_bB27EolL>a551rj8i$?5t`lO7X-)O5fqH$ zJREzw$Cn4k-xU-aB1-lbLekM~L)38;4Z{{sNokJn==LUmEyuBu9)3H6*~M-=@doi6 z&ii~RP99{ABiWrg|U1cu1iX5J#MFw&ApPq-R_L!$Fcg8vSKA?Pj7;}|LNW~)r!Y*VVVbs?e#bFf#&x{SH%4;`W70)?Wx{XO^X5U#35(rJ%O8*3zB^A z_&($u(L;PWqkV}I4k&?6S2ZGtI?dx@2S%$LRrM;Zjzo}pFXI8yymA#aP}QvLb-K5T zClk!-#Z7SBE9J{rJS|9SzbR|BJ0*P{TUG4S5R*#ea2$ z%=>y_4I9?C9bZ%ozbL{V&;VBk{};EQpoZdK9sGxaqL6j#`R77uLPAmK|6jNNsfKIj zjB30Aoy^4D@}7|XMi_}@*P}QJF|Na2Ec$pMiKU)JkY3@`ZP<&i`@Re5QG`@5f6D1G zmS}cPcg#bKe%Rm0QX=-^7Fsr>G}g_={y5vCciV)IRggBa?m0-p%0@`T@Cz}vVSkoW zX_hM(^eU9FdD~KNHqTqF&0CjT;Myzki>KJPeICL-4;l~@*YUS z^5>9fh8$wh{dKzEk7t!pW1@!oK@yBaB~61Qmc@=h`jPWYr{z;Db;S%|C|gN}bRA36 zAPFlEKswF1N0n}^l3s))?%}@$Njy8STcsXW(tnk79+I#Zis>I+|AZJ0NMfD;3P{55 zP)P5w-_c6CPD!~+nysW2kle5yVr*B^QAnS&l}Joo>3IpiGtBsft_vig8>Mv9Anjwzs~}OHgN^-=*0b(ANH4H-LzwwFk}@Sdp`_6IW?mXY zTF-fD0qI4S;vtEM&446YzZovc_p{|zkVO8vK^nn%PKI=VQ(uF$mZklW;yCpiNTPP* zF=UC_$b%$OX#r&@*WU_AE@o_0x-F0rIh9^M5~)8x61}HRL$miZgd}{#KoYqh4N2s_ z2ohbWg&6lj5)pd@l3;uWNyPK-O4l4yJE7|iN#O2+G=lT;A0@4WBZkjAoZ0whrzl?t~~;a*X?Hz57Ob-D+Vi2Ls$#j}+^l&-PE)U|*l zaP1(`LxLFBAc>JH1(JAPWF{oB3|$WCY2bp5J0Ly9(p``qXK6X4Cs=DFI2LTIf%FVZ>maRW=|xD-va|ux7M6zM-scM}Ih7O#X&vj_ zkOVGKrKT!roWe~~xG74S3h8;ak_l-8OF58UW+@NSYb+H)qH#7D&v%IHreI?ZBw95J zHs(R1HR@nv0i>5$Du?tIOLstem8H8N(Y0Z)u^iGHEUkbfav#(@%xIn&ZZscP-)PIWM^b?X>)`__pjj(vR6Q3ZpDlzzd|D9Kf*@aI!5Dr!lMc4#80=el+<$bDjPx~ zWH9C#!A9%N4|5CT4-J5P zx5x7h2K*WDXTT3_W={I;+mhMT|C)>AQ zqzvt)ef&rEv6*?N8Wpy6FTyt2U2zfHU8HR`tL#!73cI=oVV7*u7;kQY>ZB*ztvPaH zWkhYWVL^<0LLyJ}^tXsI2manmaA6$^Fk=pWdX(8m!a2&0kjTzpQ7WvHg=MxN6Nbs4 zRDmOlLZWsN3_{WEXLAc=d$?u$n+UdRGHSCe7=&tTtF=J3<1O3$F5{e-jM{7q2BGXx z8p!r&VH>%y=Y(2Xpmh(zF4?4+t+@rVd#$o-uf5vrin<`1KU~D_L}iz}o9$PdUD1AQ z6FhSZl;0cJZV)b99Q~Rbj-aMSSfRi#G->#ME^;TLQ%F=h8G>n>KhTX1bGt<`ghULw zRzy6vuV*xaAB>uXAyb2+MO2HprZI)$Y9?i3@L z$)boBSc+&Nk$u4;)Jfq6Iy0T>)3RS8>~p%68yzFiRL!t(o(?)2{J-P2xzg5ahqZYi5N>P#zFzLk2doaLrBD^6bw9aAJ*5JFYU1T zp%GN%Oi0AKSFmhRFw@3Zpcq0T#)E=^51cp7!F*thm=CP9u}T$7NW^+fu&4&63FtB# zW1(UQi5Rr@fM{z~$Eg2{@Iir1DOQASx7jFDHiSgTwQQq3jhtR_E;bpIDsa^HLZUbm z3_@*(J#!0W`z2vpLQK09DVBfBgR~2q)ML#pkll@JH^>$%%}hA{FIS}$5|!gEi!n_= zd)pX`6hlbF*dZ8>x|plf!^naE`!?Wlqrk>ote8R~=3dL!2my_^F_tKXkcjb~VAPoX zw+GVP?occt5$gj#KglK>|5qr6kcjb#VAvvgpp9{-VhD*CUs?#|0sr#h;d3VsHVq-qo(T{jxi0U5_&l8T4WgmZ z{2s9eVfVRGv4uqJZh~zat5R+L9#IS-5rb}V!e1S{$r3G~bWS(7iHad4V$ge9W-Fq$ zv6&1?6*y`|AyF#|2BB`k&)fpp9wKZ@h-sJlf#u)wAncOOJkzK`>Kqr_ZQUi@XdTqf zXmqB*@%o4AZMDyrj)O_pW!AZ@lPDZ?;*B>E&6BuBsH7u>&9AyIw>lTfGdGq*rK#%gtI z+NFB3@*yN@JzyJYj6X;dL~&cmXV0p?xnY|IQ*S|L$+ z9%m-6z#S1WoC7VTSnc(I%|@oOAtXXRBfQ&YNb_xsEX5EKF`oBhq}dpBw@{2yLL$a1 zBA<9J@3NrwM*TDTsJ9ge8c(b|+gJRiD|v!a zer9@6W@K$OBrRSPm!6kbkU{M^J+EL|dR}A>?B-=fW)~D8uepWO3gEbCQFb~SRUV>x@Rz(z<*XSav%IM} zbBl8`((~fD^|>Wei?WKd^63wP7vzsEDJ(1~^1_yxzX>IIGt%=BGgLDfS&=hyi;L+m zdNT)Dcx?Zz&(<$H)Ux=SZy)Kk`jt=Hm)?B$x*n0kroMCYz8eNcUsh*K*^bY` zdvE$+_bca)Y_1#g_@1pD+jeu;eJydf4t#;kF5Fd ztsgf0(z;lDbxj?DRD{;IKKpI=?-{470d=d}FA zFO;p#dHU%x*Tjv-u6#c&>HDf`bDr;{UmOtq=z_f2)g#02h@buEq$7=YjCOZ@=ccpgO@52cne}~DQCs}} zPp@D9;2q1WdMDq#A>$9nJ82!BDc<|)tvx@_Uscw=(KQ9*@2}|Gqi0!3{Rb94;!6Il z$*d-MbFa-G(e~BWeO5nRdbTP!G-b)MNkcmwsXWlTO^^Q$>GJHkq?R+U%FAkS^x(!7 zAD8|+X5O-*2V>T+_+V0#^YmARp(cUCPK)pO#6K?R2o zE|~h|rsBPWp076Fur5eQNR*cRuoXQlDm>=kB?7MAq1xchWcC zvOLo0p1gilZt2y3{_1Mg>7H%E}gX z=X*;AUH-g#a%(>p!yX5{Iw|gGF_VlxPACKCfYWI;=jm_M5J;!JYo?Jz!pspXx+y+WPJDx8Jp|Y>?Sr?~m)(czcKN-J5Qivg);| zt23H*zNdfs&U-qI9`NIu@J?Se{Ay3wOC2N5{O9v)#@zeuOGyVlDe!*Sy+ywPCf}R; ze*UbPBQtv5G5t)}UmyM5^;B8H&-D&%`#5joszalHKVp_QWl7XmZ(I{@eE3uo&w&*~ zl>Y@);}hye6hAk0=#rB&*KM4+u&o)N zYws{N|Ng*fkC{ICwUz_wA6^n_mcPYI<)L|{DPR0^CbPlY6~9fpuOg@X-qZWKnCWIb z{nTrB%ztk!$Qtuwo$9EW+ubRDeOKT8oiWYm@nz4*SAI?iZTRwUJ3M#add=Q8qi4SI zpQDYRX;%Kj+yjTpV;?_od-_{#O?!Wh`*uOg-Y;#-es1Qbn|A-ud+qPTqEpu2asQw{ z^G>*quWc6cSNSuyJ=bBa8E;Lh-+Jrt>G_|V$Dfq`_~p)tS?iNe_YU9v?n957>1O%N z{+09n+Kk&zdxku?Yfi_fulejigLl6FWOuWXQSHVIAN1Q> zLD}Br2RGc=wDU&|_xT}UFYhsV9Vm`t4bd} zdr$0bjapv4;qcvgQP=IkCqw2Ht$x6aA8$(V`S2sxFKIh>_U;d-&E388%kv4D>E#h- zd*#Nr>#%G6Gw+$l=6JU7!@d7L5#eoXjz_`apPvc7v1xYViF2nP>-^&jjanql9p8BM zPaAJo^I6-N#~*L&gOhi9yS1-B?&D{_ zX!^+T75@z@`E%Zf58hmU^s6VURzDrHV$@If@0*@DWB1wVEq#sNZ5|mm>XRQo?XY)9 z{aqzn3Mw15x?+5b-#X6gJGJxkKkSN{wmR&}hRgT-ytPl(#?L-mAM)13<0H3xZj5;5 zom~T$pW7ETaM^t?XXJQybefYgxH#>;=X%aMS(vc-%z$3o-}`14o%drLw2)GNo`d%W?Do8nvxe;qRKGiSt@6FZvSUGJZaLm?-t z&-8B;G4H9nyVSk^$OHRx9=ZObHLY$cyQ0aRX)S&mcI(LxTH?m*X@u#OS(KIGos~sa=$bD$$iDPOT0D-G znKi9sdem5wi5VQUlSFOn<;CPOYGytuah(MW-Krsr%Zgk;Ciz~?6|-mgXd&{p?;neMF`ZiLp2;6MAj&!>cC$Q`(x;qZEz6X!l3%; z=DYfFe@rvRbd{L-U;R4CA45w*!9mFq)8g}E+x;;V5y3%plbz~t&3(&f`eUdCf`c|9 z!&FBrZ$G=&AJdXCAakB$%P+gmA4AJ0!9k<2r?Stza^)$1Ol!tmxDGF84AnN->G9C} zss48GvMPL0EfMDAlKIFwN%nq052m4iq2N>tYZgA}@yE1f4BfnL2kGtGR(<7JC%Uf)P=}F>G4p)WJ@M`R?LcKKSMTD*0ph0vW9Y^r*}7@+ zR~!B9bYu+Oj;1KNJE>KGF(HaE2y`x2=<8cP^0(88F|?<$_rJUihDI3G>bWyxmSIn$ z%tMa%w)tbaFlH(Cq4?cZvhtumhN3+ zsOKLz{sac3ns&M~h8~Hb$X?%k&T@YYh6&_n2lkYwUORnH`eS-Bh8`24wr_uLSG+q| z(^oIX&;z|xKcAg>tJ)van=uzIdo*Jzu%~h3kta{z5)Z`1c>?mjG;IsI}JYBe}}&vKAQwl z#8NI=Z9clj9|QLnjSZX{fuS}hJC6-{@1(z-!Iyxc=(?DlA&j9L4fXNs|7hJM{=SAX zW(_h!vC(XM+;)G=Fvb*PPqERs%cHOOW3FLL9`>{qJ|4N$A2S>&!9jGhmCitOW9~uI z)@)NJV6{J(6Z_Lh~O#4ZZGTZUVEzPxG;# z=9Hi2Uq4MdVUCRp(dnld!*3sPeZpE%}v<(*-t|sk2W`f z>ENg7<)@)fE}NTRCHZNl_-XR}G-ZAo`U?Q&CM?tIr{*R!JN+~t`DwoM)BNeDp%+oj zO<0cd(_HPRp%+xmO|ZnDZxTA8xycVR*H1&Alr}fPdeTp`*-x|IPxHB-<|jW*7!Cb$ zlO^@j4E58D@zdn^X%_owRw+%S97XvHpzPh$obbcY2Y19~VtV;$V*NBz{4~XWnx%f4 z7p11IVfxxFHDOBgh1B#_nsZWfmC{7;iI8s8n|8WLO)sUnMrv9s%>=3Gqcr(a6Rk9N zNlh1}St~UWO0!35S}4u8QgfNo&rKY{o^p~18N|P)#F-k)(B-3`e(#(;X zNTqpDYU(S^da3EIH1A5y0Hyg#Y6dCI-%@k6(ln=w2W*3trkB(VRGI{-30IowQqx;$ z%B7~O(mXCT-IV4nsp+9KUrJ3&rJ>Kk(biLGTG9d%w$4fuBQ@=mX1vt2RhpZmroYnM zE;ap>=3%M1QfW3wO+%&GCpA$@^Oe+eRGL4frn%BIrzsk?CQ8#&YJ!y}PHIAwCPQlK zDGk1Q%3CL;Std0dlxCgOG*FtoQsYpXucW4t((r^Hwi_!=TbklyYo;{uQqxpvyiyaY zH1|l2p)`;AXYBxVnkW4< z^vb%<+Uut|=BGL7r}@`U)08fXcr(k@)lW0fPeZS~>#Q_C%`JYK2mLfp`)S_v)9m-t zeCwy-=OwjLgsTe-vs^9xG#!-2kY}`kej0i`-rU3)_69#qvDCN`V`3t5DjF*~`N;6ez5|n19)C^IYc~UbQsuOK3@Dmz7#O^Xv)5pwW8&hK{j2Kg67K_)4*iN5l z>8!gShN?wih))}x{B-Z#OidrNHhP#ERW4fB6n3ZE08QN;s^ofD$T}?x@H!yfBJAL}YJ-v=* z)1ZB#P=S_a0IIByrWuH;ciJ_5`$01_La;>qP&4OYI8t`{Q=UU{jbUjB6K&V@?FU~E z*zNS~haBQd2+R_7NVU-pb7*B}5Y^Z$yQWVxoTZ~9D@>ng)W!@=(-(Q3f=0J6ebHVe zx(3c3(KU#L{hB5QIlK&A(z4SJ1skVn1|UBRG|fO{njZbOSOejU9@A>VpeU-0d z$zqJ=Yn)gE?7YOQ>^C5thduPK_Zo4%}j zm&MAFEXHWQX!SlgC<1#b*ZE-!uj-?GEs-q7XuhyOZ!6cXUptStSkFinV>DlM?gm04!Ycl}|F&DVF5#Td;Ob!ky9@^w|~n}4)?g;CXFV~pl& z8njj%_O1I*H;dIxvKXWJ%3zjRhf51xMbWAbM@bfAG+&vTub&_FCR(gQ$zqJ=D@*eg zd}p&YU6il;B#SYcFFMCt<@)|VFC|#4HzkWPny=~1qGXBnq7(jOHsx^F?uJ zvFcrhL~M-FeC0wb#$NLE<+jH@Z=rm3mn_C;zHVZc85@1`?tjT*rAiiKG+#5A)s^=6 zMVxp$-(qar+rli?YRO`Z=F6-3diLdJM=jR7 zlEoO!SBYXl;B)0=Dh|&`7GpGDvlNSR_-aa{<`%0}OR|Ky6n=P4&ok zzT~+!%GYqoVvOc%4ztXdr}LM^nkre0(R|HSz9@&cHn``s#abX)jM04EqWRiB;?Ld| z>j}wXjOOcB&DY&M3g5F>J0*)Tny-19uMfI@db7nkAz6&keBGw`nl`lR1B(?#T>%?o zG+*-(h=4+wmYr`(z?H220$zqJ=t4#B?w_iBMD|6m^RI(VO`6}0ZP3`o` zZx-vUWHCnbwMhAbV03r(ygWwvYSo%_`1@h_p{Lm9*o#S{=Dp7>yt0YK>MvQ0(R?jo zmVJ(0U-`OLvKXWJx|`qQ(yk1;r{gQ$`>YLyfH@ebtm*z zxppr3VXnnmFIkMyeEFC~RZM;Pp=n!hwOEHGi!qw7yEI?7Exc)%#rj>c7^C^BWR@B8 zU1z?v)nc{29EsQ%qxo72tyQi&=3P0!Vhxil#%R8lG0Waw15_QROBQ1^U&}RLuV$T} zZLvxvi!qw7yER{j2fyP8SH4zB7GpGD_h`O~@BgBM#o8-bjM04EtNFTn{Y{T{Q@(zd zEXHWQR%pKHoMN#qy8?;W7^C^R4_Z<4l>W?s>%Q-yd<~K;#%R9oS1gLCqt0%>S*%RS zVvOeNKg_bXS4-t!w#vkG5DZOBQ1^Uk@r41f#t4vH3lfucMO17|qv1 zibdtx@_6q#7V8hmVvOeNVP=`->T~-Y13N2Ut*MJ+V~pl&CA3z|&-%|5cUr7rlEoO! z*CWiL{zc=)O}|D>X{&rql`O_+z8=+ljdGR^vRJoC7GpGDk1?w`?eTLiS{P%o9+WJ` zXuei4%baiA+-ODzi?va*7^C@moLT0$@$_>?ODz^o(Y!H6^YsL?l&}2fqb%01lEoO! z*OSaL+l%^ge^rM~+6rHc(R{7eeC-*~?-z^JOR^ZF`Fcw8MX}LO`5GlzjM02Ot@--1 za6+WT%9kw0Xuh6d7S$nb&y=Q|!iQDkc zYQ8eB3&S@{%vN3}S&Y$qy`=dn%V_*&h+@4fS&Y$qy{!4#&|vn{7VBrpVvOeN70nlw ztCRB8vKBO@36I-zqMFj zOBQ1^Uz;^wiP2-fvRL&ak%)~kny)vY71x#I>%{R-9<*4!BcZ~^7|qw4&|2-a@ZoMl zE!Ox*;)qY?>({VvL2JF2M6uC8wb!kY#KA`p@zeYA7SgEse8GmRzP4DaB9VxVF5T>C8sP_ zM0=>PF-EJy?a*4jR;|6yYq17M7Gtz>?NBVTO6&6uRfkg~i!qw7or*;{?3J8RXt8dS zEXHWQ-cc+F?5nBr^@wCKM)S2xvB=jOzXi9nSVtv`F`BR4%%c89+rKBKW`rtV;T?pQ zF`BPENU-XV%4M;lC5thduf5E&kMkboYrJGJM)UQq=8M*`EmomqF-G&XPxDp(rv_JE zqkP>dS&Y$q?bm!A9{%$=i}k2vF-G%sfLZ1kb+~!QwHE6o$zqJ=>!9ZA%uW51E!Hl{ zVvOeNJ!a9^ORYTYgQr~<>l4XhjOOc*=IfC@?c*)h8OdUd=Ib!CBC!v`Z|nV&XAM_% z7}^mkY>d%-9f8)0jVo@e-`Qfdk}Sq(zTRh6E9}Wv^55&*4pqLck}Sq(zK&|XmfWx; z$YRAx7GpGDA25ris=@e$Rvk>VSl3GyV>DkMYQFXj`_o~uN+gRhny-(TWwzIhjfY;h zSj!}fF`BPqnlIn)-`2NS&q@|!G+!Sx%ih06t2*2vS&Y$q{a5qV@(R_WX`J!uci`6g+iP#vU`T7i6>-_G8jOOcWW|^@;bI~~EYpY~2M)UQJ=4)~5e_pXzA4nEs zG+*B`i^fBWjlY{7d&Z@Fos=xbXueKpzV7-i={buP+6jr+7^C_64q9=)l6-Z%e*2wC z%2%XhF-G(CJ+sXAa+Ky=X0e7y7GpGDCz)l|;jfvG{gSABjh8IOXuf{XeBJQ$s@+F=BtWX<~gOs_lKrftW}c57|qv@ny>2`hdybsc1spxG+(EfWsXrVCH|3Ou}(`C zV>Dlxr`eZn9X9OBQ1^U%&hL8l`+~lq|+*zRqgC=$@~|Iw)C;(R}^EEILI7|qu?%@^Ivwpf2i7GpGD=b6=t_V}gUJL5%*Rlf^V*chYv`V(4fz7gGb zcMprzRo< zmpxmU;e8#WSCRFsT0OQSPm@OJt{c$3>PU35v_lx36{fMS-`AzUV%;HGgwa{_v}JHm zTWNh(#IZ_?wOz6ZqqD-9)lRb7yteLUi*-)22&1zaFsr*{efw!uj>U@ZCe(z{Sq+&b zla2Jh=y^=DHg1w?!sx6<%nFyjnq0QbR<6~OMHrn$Z-@s6DPOa!zh@;)@z)+_t=5Ng8ctjn3@kgOpQ|E{xq&5$g@=&UQ4 zb(v&cHTR?C7OPUS2&1#wFsrv@UA=gCoW*)gvIwKI+A`}J$=W#g6NHIb^FK%yVRY7& z%%XEHZ4;iYK5Vf%%1R=P&T7XjS;fZUE1%e6u~H<9Fgh!eS&{4scT1n?-`-+XNETs4 zuD6*@1iWsiJ=?*c!`rM^zpXSmIO9ncVRTjpW`#-Cs6O9}u~?r;7GZQ&M~!vVeZyvp z^}A#dMrTDa%go^~e{>ydu^ROfSs;wg>ZGxnl@yJ%SZyVXFgmNV#`Em^L;qE2~h-_~!3eZ+elpq|lR}T`~Gh!@s^p#=39#@o}F(at}H5NY$A2PPI`NjBl za8^=QadG-|(|cTQabdbQBS&h@lBZ^6&8VS5%}LF;+?ghQY*v0|4P0tLu?aM-O-#=< zRjM@E_!M$x!R*wcf(#QjMt+q$mOgSFKgU#yVhXsWjmyHfo(tv*wX`}mr(m|GK%NuR z=VldUWeT;+i|<2EEAeI(n~aMA5|Ec1&1Mol2d*j5yy6%omuBHts`An^vSwPXU}0+{ zc!~vKLT+*Hv^=wVJ;fe;<~rAmz7h0sYk?bAFs{IiX;1NW1qCzFKScYd;KSLm>f75g zqVfugvuY}l8KsJ&w<`n|nGd9npIPXgs}ijGODM=Fv6b6}P^?iwFgQAEF1nqH`K0v1 z3AyNm>3K*n+nKVHUg#|;GD|-OA)k(HYs#eJ=@d>01w~0EdEVT@JlQ8~Sr|JP-*%sw zL|JTTTVgrgLT9R8lPYq>i6sRdOtU$leMtsw?qrd#lZAK!ne61!FTX5}9LzI2czT z5~Y2SlZ2vznW+W2YQUhT)_lOHEw?Gz*~OY7)$7T(rK>KGSb&(dN+O)ul^k#A@uW-j z7Ma+@g7i$`-_*!1PhCRVBaCMzMl%y4#tK4s@-uUbtO^$~k(yqVJ`=-eQL%mWPeK>- z78Fqhh}=o*$e2vBqoEy>KHEcoG{Dwr%&|))@dxG2=;KfwG1r?lu3%zrW>#!YdXcyS zG{?5gtg-y%ddkE2aS4Nv54>5$7l{HwN|8YmYJ-@ANAU!d3@3t=qLKWy`JzCWKG7pe za`Q3+VyIB@MMVX6;&^(#GYkDR8C6H4l$kNa!vqwj0B24b5KZ+M49w_hfs#;l?xd7t z&$yH^u?6|~HokW(zP)cJoAp7b2AfT7u(#=v1snl8F4wEsQ3(_ZHUe@W2SwSwzv zg&vD9><5BhNS~NHGuIo?iL1B}fjNf$!hp>voF!0nPAkdI&MK;5S>=QwwI$Y4seBH} zmZwUaN7+))=(U}cJ_mW{66*=p`PF8{jTrDVF(&Kg62yVfA~u zTheg?50n^}l~GWHzGQc)mKelktYC2Azkfmlmu{b?BQnvJAO;_K&avuIs4;!vznJ2eEXO84y~?l6 z1L@3}nHcbGiB#?jCB~0TH2?UA&O$;mVrNzsP3H5`?J)qGDitKXJ0p?$DNd7_9{Kl7 z;?2KUVsBdD^uLo5;7_F3a%3OF<)1pSrFw9#oj5Yles1Go3-cvtX;l>N7%%cGfPA_Y z3OU~-q)m%h@k7!uX;a#Iag7vV*gksNXd+RLp?-RE81YMpOQ(5>pE{N%;&OEKOO&IY zO^-me9a-}RE;%N1=!v#;?$C%Kx;9nyqdJYBE*_^~IS&!j8BBF;AZrXp*x2+uK@i7d zva<2la&lw?imNNx4zU;^vxQYi<_oRu#94!F> zBmQ0vMqgYLh>j)Pq|MC5T#@P`4KoeCj^_hp+q}w%D@vb!ZAn(q+ywlEDsvvGl=c}h zDHHG~cZzf51d$Z3jEt;8FL8^F>E`TWtamQ1;WBax(AYdbH8OZYMp0y>7Z&Etwao#H z5}skns^X~05SKhcWn|^k8ATtLjm+HQ+O--{9%S(Kf!-9tvxsocbFs{ft*=;Tyo|Y2 zLWCrS+F~O+*EdSf%!0m%VU?PO)!nt}#&ZA-S(m33RX ztk=127r%^C z`X}0{YH+kBm^IGcwID>{YmW4RtXvo)?9?3Z1KGJS#$G5n9MW32d97@(kwD3Ix^3vT z=3DY=*>2~8IJ-erh5EXJ-BxXofMxZ8taT;3fxrN}33(yQ z*JJ+S79iE19B4Jlo(W+jAj)n`71lo+HIr)60&L zPm6V?MaRZFN5+nb_au%^bWWsI=ixEK`zNGh^*?iXe{aF?{=)3={$oata1HN2E!SyS z%+%2%Q#>QxBQDIGnO;0YV~$96x<|R=Vn>foy)ZKui^9qox7<#7&=a=Av*E|GQ#w3}$cqGLxnM|u+DT%Ot;;31kU%Z178lj8J@NKT9$ zkrErw1G$NzU9@71h<7H&B_zeBxLvhU(um@rT`cWVXqRkSh>mqTN4ipzQ)Ar;wN-~% zk=(fy5iK_&!9CKQ;zrzbgS#Hb|CC^(DdfsqZ!`7uhO zuox8*MDXeroJsB^^bmV{m{$$M`{x&+LUD7|n~T7`B@3^SrKRz$ z(-C+C6f$y^=Zwi76iu6X+%LL+7Axe=(hth+XG>7}z8S1l$1wx5NuiDh4$RJm2FKPd zNOAKqEp5)snNH!}vRw1n2=6^$V5EKPGcbD4!06}!(Sz*T$VmKEh5-WxL`L@Q+c#P; zriN!Oo@{J=rf}__gn>4|nUu{a3#Gfn;WRG53 z%mOB(8N>L`RRqF4h~&3`nIPXnqL&;3;U0s2J}_kEK)55&4*{l83kcY1D@O$0 zUlnE9JXd^j=j@N)$9K|sHVa!@870FMQ!E*G9g?p;(49BHC&HtSI5A{^tNwZnMX@8uqCEp8#g_ zCD@}^O%Gkf9);a$VCu*>)2JM^f#m3rt&q)+R7V={6zzkS`!x_ zUh;vtr6w*w{XGE8nwq!(_I3etq$aM0J!;=Gz%=X*0o#S@uLUq2B(ApdQhPXonRE&E zrU8?G5qs2s?*eAkCD?lonAa|1FAVmMN(@BaYU^*G0{8tT*sI&av~*#6je)ydVlPyG zgMdkuxC^z%b--j_g1vHJR$hX=r-6C-BKD{~4gvE`Oj8|j zCN6-z8-cm0Cay+2Q~ccl%&MBW0QR;3^KMOC4SSTo?}7QdCN6-z%kj!$XZh-5ZRMr$ zFAkV-HE{v#6#+B9Cay;Q$lgj|*44xXu=g%7AJ)VLu=g72S+Sz>(h`mw>w*IQJ#sXu3J=5^x=XTYL#Pnr1wE2{^KM z_!4lD!2Na!IJ(|w-UmC|#^ZgBxFTGuKsej0%4A{>=HqQ@;OMXJ;p(t=TzrCSeB!u7 z&xor#l$7LV_R7nh*5Q)WNn`ICs+aZ!N_cMO4<9CY@)CB(-u~$!t zojV=N4^wjR^5~STJUl9$iB|#ArxX?y&|AjEQ|MmSl;Vt{+(I10^y)Wd8ofC-Wma*| zS$+D&^qe!GUr#LbcylwR6c=SMx))x$nJdKLdC<>F!X;(}~%WY;m>B2x;z^ac`^DI#MFW)@<3waD0xxT}~F)oP-< z^vCGBIPlS>hvAOd>8>b`ie$~7@iBYdm3PxePU2&>x+@zIqMEM=-M&5U%5hPVZr?Fe zu}=t_Y0l#Iz4twv^VM@#CPqbWrYei`ZFg5LSOCcp5#+9{V5y07fg{4R+|k6n+!5hg z~L58?O_j*sK`IF8TY_>8CQ`=FBN-M*1w?#jEOA`uCR|CcZV+9qvB1S+jR>NUjZ3yHo}6JiX4L|0oO zh6j6^SB4m4u&1sa!hi8_6ifF5P5KaS@Gy6UH!5TAB|es6?svau1z%f zP~b*xuBJ^4V2G)@2%WqNE-i_L6)4|bQ9ORxI-;B0m+quoq}_PK4w@;5u6Q-1arlK8 zRAf5&g%}uvWoL7aoiNcg0sU-}J@0Yo6}}2`fjW2lRz|G?A<_3s%+}q=A9YIu%!UxXo+bV+H zK)KbxQnquF>&CPjuirr(OB4eiH{nqw#JC%hHBz*aQC(XDxP5wVGIlFR&tjF_!eSNqDN_QO!?V?hTdq2l`EsDwLHG-BR#(2t{&glX*;OVYc|^i=xA;jVx(hFUp@&jW@NyUTaV<@=qBLKT&o9aphBY6Sy4mCGoEMXN8`>L{l^6!3dA<(?lOKgbI|AB`T?6CD)P5_hAi(jzypUTU}i?96f47loPp3^sS3> z^Z%=(Qt`hV$IJ15N$1V2kon3{C%J@f-yx6hJ)D^2(T?48iZ!axd3I5BQOl|>RJxOz z-jznZ$QleL0xt#wFC-CFyCI1PqS>MwzYvZxy5^>n;$@eG1?c> z*Nu4Y<__hss4V9UBzE8G*cdUwv9Y1i{cuT`yKHNnMSDwr#L2s1^$t(-^5C;=|o>6syHfdimzd~$c}5sr}O%_D_4k2qy8dAJW*W?LN?=lyEg}+g}?)TdIOR6*2Kcj?QZ@s$7-DTUfIkvQ0#YxNP~ihlb1dfh{%` z{qRq9H8oL3jt`Ho;aT^hz1~I`NjBF(6^V+g-sKtc+q|zlJ~0p_B8n*bs25XI()p7^ z6j8~blE2AXQ-r)z1`iV+b9Iw)LEf3#GD9~9dks4 z?(Q-M6TWO`^z}Pv5E8=_Mwmf~?>gEofK!Y+74*O3|Hu`Vr|cxIuslAe?Go|b|0^EcwoAkXq5%IV zu5raBqNnm6YCep%e5R$j+eNR#sdG@xy3skbYfIS-SR|31qC2GSFdt&{hm?R{2#1~s zCb}~!E;t{8)P+;&?lrMOj17>wvPAJC7<5U5E6ma#=?tu&nfOHN`&jgDo@n^?xqauv zvF{^_i)cQeA+rn7D>g(;rT>wV%5%+_BbaD1CL3uh;CoXfcDu`?9>9NC*_6TUtA}+A znily+hCrfF^-YWjp4c#WVpzoromw*e$LgB+{JVh|c21 z?1D0dxoktxad2Q%-6B^=%Fg{+QeU1Ys>YR_``bE7C_DGBbu_5#++WtwRb}U@t)n(& z=l-#d8ke05GS57Y_-z6Enl?#6-Q7s5l6lO@`_S<1v-3^t!Z z5+eXrB7J-|#GtC8kGzH$^bybqmZGqykCtL-0(;Vj803>a!Wm*DV^1Hu3^A_5o<1rW zVq{@YpK1&-3a}UPb~_|Fc#WUH(;BK^|KLgV{fxB=x9?r7TX-CC2i;}c#B|o}`yS^y zNBPYd4{1NBP;NT6KcgOj5Bw~h56F6LRBPA6Q2a~6Aen_^QSYq{xCz`g) zMP3Qxen+9;`$z-=%g5|XCAfsg8Mi%;Z343yeGmoN7w0=C6mh=eRkJZ0r)uQ|5l1&M zS#?Z2ORF1aesxTyjwpM$xk{4l$lnToX$qpNViD-2{C zmme<-f4>R?c!Z#VrP9diVypRSQ$Z#wx8+M+V4+KtPRNV8Lk zcA_iUw8YAUki`Fow>JTgqUhR&dzc9X0!-LJ5eEnmWD6uf0D+lgCYgjJ1PF@)l8}W& zvY7-3f*K46afrerJmQ9k3%H{qi=u=@gDZ#&qNu@@O+`cn74zTcRCV|C%tZ3N|9ic4 zWx7wFy6;m$m~)1y-0AgAW=C(22DurPzwA>_3pifS)oX`q|BpL_hlq zBr&~0kH%u!gsw{=HANDG@v|r`u@$;en$Dr=WUbBr$9_4=IXu>9}-+ zR0v57W*&zmhA=gdWdB}yCcJVqD0q%)7kPN636;dn2v z`(WJFOSpXyo-Pm?Fa`0~G@?J~A$7rAI|C7GQAR)~Vllk=-^c;A7S8eiAP2a|h0;B4 z12SdordC0N$sHPM$5x!}E)}hmit}G9#c9Wt%&0o_`kyJy>zW-3sxcQgNe2v}1{G+-egb|N zg(A>*TxysM!3>*$Yf^t_GU25w?Ux zwr*ry_uwWC;=#TteEkPynA@+WO%n1;Pz z3W=Dvv#v|`W?=PItfn4HaB;Krrm2#GoVJIk*EfA5sD|qx2zx>zdn;I{=OkFm34MjA zhU*~+rjUqv7wfuo2~t{YY+7e2Hm8fSqcI{T6hA!|^aY|Crb7_6ghaO1u&zsY)Pt#? z5`4C4aZtJ?f*AfSNIicPI|DyqOGsqve%5vG7OZr`M_6q?>Z^q8zecg7(Y2sxXP;_G za5`&JS4ff#>20sG9w?m+!04?>%@wsKJugC{_A2a>P5OFL4T0=Ffk<3UVa=4bS$&kY zQN5M6ILo4SAPN?YXZWyc4EvePr923U>f;&KiL3K%T%B)fS0_D57|#Vj+rH4#YK2FmYw=!M-_i6CS{cEvd)n_Dkq_fO3(*(2K&8nSx`ab~tjUrMVXP=2Xb zGAmAuM<<~?Ns2?EJB<9N8Cy2F%~jHJvu&m9e%b~{Af+}ZTwG7d%U+B^AlUk|)#+N#%go!@#2lCc4a==dS~~m zrnbK{Ew}$eU;Q1kKJ&$EDqGH)pEV`n$GozTO}%eBF!K6Qw+>!2ZN=sf!=D)(XIegL zP3F;e$9ypUfo1EnpNSo_JlVbe<%L)NwPs~P)y3hP?|*jRU+)dLbT%twch&jXl@Hwb zi}F+P@?rKDHuayeWbT9GYJb@im42pjY+ToyZoTT*l@`n1wW;s4`1SGT=f~R$>Z)#d zacIcITlOCP;EK*i7yKM~^>?@4HGkZHr>=Tr*x^6Vy!uaO^xAj+I5(`_4~};pynT3= z_&F2X4;?>aW7ln+>b8`>7_;sZSKlL7r`sQG^~qbO<2GIO;?CTn>G5CC)M&*4YYl{vvu$Cx8LuU8S(j!=UaC?bw}8% zi-S_X%YMJx@?qnn@7j_-F>d{*y~bpZoZb7WPiFRh^5(7u%Q9ZRd;a>F8I!Jy`Mmi0 z`a$M7&wmwF*>dBm^$+}7{qE-b2Ok zzoKH>H*;3rXIpxH)3=YDyYtiidkX3w-5Gs#uhl8bQy+b2zH7~qtW6>JM%MKnl~oye zlf7_s>3z){eP2u7{`Y_%mt1$Y=jl~Z9iCZqe0|(MU826dm=M$QmBdTuw|rW?=-KpF zUs4v0iJ00UK5xW^K0WVi9TK~?{I4hGUK;<;%|%PoyQST8Bxbeqj?R`J>(35t6}tHG z)oRaT&&0(!FfZ%p+byR0dg@W^IoTOy10y02TKY)m7Htjb8aOC}8J!Zzxmcqc8e*Y0OCEgh7HO(d(F*Sp<_UyIS`(uI_L%nWu z{C0f&5r#mNM{heAJi!i)wh43NkbQIgF_ePYL}PhM^_{;G0QI#)cS*D9VcOz1GW<2X z0rAC93TD$`Y{}v+Uta^0zL*w_p;0Q`3p<_aFw7ql!Weokq|x(t&3{HAeC-h1Y>LH} zVn&V++Uk#?NjS5KMvIiQgkFV6+}BQP#?UiZ8%Q%hz4CT{jFmBTm+Am%oB6lD{V}18 zp}QBImA6_Xp7zI33TBgvxpBp-dH$HTjCq%~_^tdoWre`tfX@!?DNs8TV|5m=5t^Rr zp{5z`r=c9EL9mb!EeOp#?O3(E%un-}pJun8hDIf75SD*e53v^-nv+t4(9kkAY7iQ` zrm;y@rk`fH)PyK1X1&z3)-*3mO-oI4NNR#K%{i$tYZ?rBIW*HWHmPZyPnuAi)M$>#FHHxPB%}*0VO^SnBKlCEds2S|1 ziS^T5=ck$Dr=geiM$5PRX{x2BE%GeHhor`;X`c3D?J{TzvI{bc7kZ}!4TeG9ny{pl z=n+yueM?gXn#jRYLp=a%&=ZM3eG6*_tJe-))2xY>5bogwMzu^mtd~S{L%45(LitG6 zA!7^+DbiDwz8K}j8{2=OvwoE<#u(C~eob5 z*|j?BF3DnyA+0M6Y3+Pz`R6+8Imu#-A+0N!MQw%xEfU>QtHbvti!p|@x&o`0tMwag zH|eZjB#SYIw603V+?88n8kN_NS{4_FhXbDAz6$uq}82SYPqrwt$eGgme%8v#TY|c zJq&4;H$8qzXT2|3j4`CulUdYes9f(|G4tVIEv?@ri!p|@!VGEAg48 z(xQGwZyU#Im%XpE9+oV|7}Dy?EcN;dTj5!$vuY%ZF^06RF{JgMTr?b6|`itpUtZ+eZ5Zqhl>vT4N=P zF^04T8qz8}n>s;f-5^_hg;*v1BpEkQUuDjcK*f(mE?y zj4`AY<(HPuYAG|$7(-e^nWdhuzc-Bhq^*`#AIV~jAuYOz>*Xq+*nEJ_8Y@|hF{DLf z3jJEXa>nb=TeY;NNETxZX+;~-qJCay+WIt;IM&(T>SG<-u~j3F&Mw0heJ zf9UHPoz+9K7-LAw!7Q~u{BZ5K{yJ-fWHH8&R*W&NflXf1S*eo67(-gIhP0-K)=t)0 zb0mu~hP0f9v_h?63v|}4lEoN9S}sFc*DUsKhifH^F^06_3~4>y>`aiJ)-#gD7(-g| zhP1vO5{KtiJTnfIt`{YaBFY6OBJ9G~0M&md+X{S%fjNlAzJk z`p@^zKdG}8Nfu#@tYl`<-IGGEbsZ1stcN6vFh*7iG-eacX;7$N`;%8%ha`(IMi##r zGtu(`g}g~)`s!)@Az6emvQnWjo75bd?|b;7&gv0Dmc-i-BWnV*W)qFZDLkA|vQ=kI zku1U(Sref#n`oRy;Yija7{ID$`3}h#RQ|i!eskWM-*py*4v;i_VH_NtVPn7Dm<-Xw4=YwiJvDHy243VT`P)(3njY zq96p7=KQFqg~t&NgfX(FL8G&bODE&&dJcpU^;#=6q`ut3#Mc31Hqrn48pBc8kgKw? zt1V}&w(1bC@vE&q3b$WQUPdxDqgY)@Qq%D}m5F$zB5lF1u>ku<5Tl{>O=EL23g@WH zhQR{Awb9qubrsGlaEf<2YNVRg08s&XB2T3%4VjUC_Pv+X^fD%6)#9qFWn!fvTJ4pV z&=ftN@KW~wdsR&Gk*+4m@5Y36ls3@%l~`Zuf4;OOEeI`>@=8gs5X}*~>JeIk{g>wO z0Zc6_nTrJpGmKWX{QIorrs<7vt<`v`Q42n5Z|BC2EO^t!|7CmYWR^uG@|t4)8n5NU zVtIiqEl2Xq;{6DUqiN-OV!R5s!5V8ggN~AtjD-?6sW?BcEG9Ko7&ET=MLy(w)&MII zZ#82PF*_r3u3Vo=OXq*IG?jm&l73A2#07|z4p2GTzv+3C1H`J1Q2(7RR~u-MudkS) zRlH~kGWCYzy)z&90`V?D0|;*;xFi~0CDz;4zXN?t%2TRcWj==dq65?YFUG)j0^kB0 zG+w-cjrm}F3~A>}Ug$nH{GvsBkqgzJ3jF}=SS9RV0K$S?rlw&F{{m>J2!WbYnN?FA(>U{nB_+Q9^%X;G3^;L}4%il17-g>zWV zh&Y)(O0~=IQ46fhqkE^9{ArW6nz6&O9#S1oelrxvz{ z1xEX+1$ua3w4Yj_qXVOT)xrbx;24KJH6b?M6`vTxE`^<%``}3=rP7Ao9y>_7PIH_( z-ky?>3dg=Fv3AWvFMn;MAz~8ku0(iycDmhme1QZ9zWfQ&*rD_d(%7NuM@SkT?vUN% zlj0rY#_5iN`NJd)5t9t}z=?@54yV(ueyjx7vG`g^dTQ0aSJEl5c4rJs#<@~-tJ+6Q zIxNnf=uVD9C8YRS7N0ih&}29?j&a1q#KhUf7fZs&Hh=IWMD>#=oiolp-UU)ZT&!LF z3<@5n#dlC7h!3GOd@P(Mj~fr))2S(T?q7TzdY5LyFYSE#LQ0fhXF8EPcT8-`_y+t7 z^Jh~;;_s%s{O!gj*xk;g_ylL%zcc0MRNhRd-4*Y0rN(*tl;$puylNK|J3oI;>1*p<{8?=M^k9*kdPJIuG>M}h1G^0kUbN5ut(3Y1eh-+uAy|xk?sj#(&a=0CNu)(uL;WgCtmXXjrjx$5Ch^o(6>P5 z*HQrx8p_{|i2DGTQ9T&OZ>%Q!?Y0p?waGvhcAj;igH#0ZOlar6$c9=NvQ0!6z( z_UNn9ji`)G{RECqb0FLe&`BSd9L-`|neSjG*asO6c2QbNvus0W&MUAkx44BoIu}AIid0;;D#RVwu zFTh;##RaIpD{+$h(TPUT>Lq}^1Yjon;(YAU8<qu<8LZJGiODMV#I2zaFHUc*sxYdoo^#txfBXE@N=|tbq8)-BXHEN^8IlB?TT>4jl`8T5?9^`99>6?{cx#%?U`^Z8;N@`5YESU z>k16`p7Fu`pZRXxiNY*WOw`BypZRXRu?Q0hd6{$ne>-nQo(ESf+&$90G5M+cW@i03 z>|Uj=Nx`GPzICw8?pmj7QW_q_e2%~NIX>@m{F~45H$KPT`W&D0Ikq8BG;p9nd@6o& z3=T_j)9 zAJKrGK0XR$XH)}v`hX}9o<0!@q^FO70_n##ptm=mcQl}nX+R&_fZo}Fo<5lglu!C7 zCXk*!dkLg>H=s{wK%dxvo~983*-vUfpWJ{xr2+l;0DAf!#Kiqc2upk|utcSz8?;GD z$CiekCZ!x(D@&`erR(0LY}TY2NYu@nlutG3tR|6v4H4_E#{35SlhI?sJNQ}P5#|^? ze5`=%?coECV%?RaSJ3Fhx-j>f^o4a~+F~+oT z0D2)wXr-&O$hX{{H!62n;KENS3vpLQEAxUzObae+Rlmm_WP@e*sM=e)#l6n6@(xnE&F|MA zmu{*~$Em_-RftlBeyY$z6}tTH3>(r!9+Bsz)9}nnCj#!a=xmX@6XY1aO47pIu4>2M zoC$J2*p7W3R;^=CCerg^{l3b-EY{oqg11g`)mcGAcpKWx`>kOcc>fH0^kN@7eB7!6 zr6w*#l63&|Loo5B``>3(}YoOwFN1-eV z-2>jnFNhuFkYwS{1KV?KqKvh$gOhJK_I^$GJRLKR#vE>reIHwz{xU0{VM|9Ag?JyZ zbOzgxSo#gyBP{)cEnzL}B2fjOXN=LdzQvPqMpd2Oo2pwp+#8*N#yxqNOav= zlwFX7yP-EBIao(NN9iiHD0PtVMH2G&Eu>j2oq&|i(iun@ES-fko2B!RGFiF+DTk%M zA!V^dF5!a7T@KZ`_rt%4NL;i8tl}-dn zcG{%UCLJxJe$@d1W>2KAr1F8OKGi+CrP8dTtl8*p*v$)fdqN1D3NPj?G{izX>Up|@ zXB<2SriB&Pcc4{`M&FGw`n;C#4Tpautv`Vj;6-PjxKh8e-W3NWdE2QVz1rB|ZD#`= zFWFCJ7v6S6qw0ZUaayP^5z;mG1)Ae?Dn)O$9!{A zHD5f^;g#mN-GtA!BkXYpB) zy6FFs;I3~o)aV20WRv%`3O=Mps%Tweg6GZut1fXFCG0l8_rKI79{k_y5@pq(Yor>Z zu5knJ8|)H?BzfA%v+L6(I_f6|?h~bRr~u~|7vSYW3jjnb#+^-ejXkAg;l&6j zlUd4#G=-&NNY}Ac25BlwZVy)Qm=@};Dux61a@%C#CmJrxt8*VgZ=oQo*1p9DtbNOO zcz49EKj0{q)`DQ?^yqJ`OREVwwI;IO+QzlX>G{FwA!)nQ^D}m}_#MIT2d|#jL&lS; zU7M<>rg9%^?0O^J9!99$uXZ52V2$q8cVm#V!VRm-ezz_?figNhe~ftb0t#xq>nIMf zlEF|M;0pNzB6lPXtVDqukme~3iJpbRlh)djlxb-VpUw-h>_%A`Z6;U#X|gU`iD>wK zP72zzz!qbxs$1@c6U9BJT2}rU?0}z88hx#a zhI8W+#DVkU(<9@c3fctsijJBSSW(~|8B=@OmJ?$wOrxletkdDd@||C;(>{SG$0HK4 zU*sLG-QAUM20KT+#06bB61SC;r%?$WUev%{J^5Z5ZDF8m!#+&0D;3y>qw8N3%6+vZyT3gz27V*zkZYq%(7b5**Pcwp^hVHQ3JZX zu&6;a7B#RZcow-G*6`A^*et5U5(kc1!r%4GeFIT!(Kr7BsS`*R7bFpTjTSorlF0L3NOsQOhmb`7%0o|D z$^z~hvFMF9)Er9BWVq9zS;8Z`_lOSTLJT*p+)dfl;bN%UGwv+61p`(c{e5}sb_})D z2b8AF1x2nx6AdquSP7>svL-50y=hu_-4k)^NJgxSGf!Q5EKB*=3WlA0dZSn6YmrxJ z;-y56s?U9ud&G(uaKGBmS#7tGgH}8XO6RJyGz9#azQaRfNfCv?_|AKEkksk?-!!86 zVBn}a`GrKcZ41_%Qhkt9^|s>^MYk$9$EIT|s-5#|6P2qve3somDz}|lx!OG-6}813 zwanH#RAtjo!X7``iz=eTMHSJcho~Zt!{YSBSRA8j$}En4HTyiKeogk_$$j!9M_NMl z(<|U-9=E-8v4^!3)Y7`N0QdTYB{kIY-Ane;E@8=qx=^eT_?BY_c8aqqE3BNJ9m?Ug z+w-^T)YH0*u&DL&>eNs!tAH~S3j<&&1_32+(5+O@_a{%oB9R=Pzv`<`fTx!OXs+Um|?l6lf@|9+aA{!ZUTsBlTF6WBJ zsf&T5?`wB9}%ceT?^#S#c=FtjzE$fw&>z)> zTfXaEY?6;@N&maKsj4~D`2}~a>u+iaeB-NiU1$#(_AP8H;<8x_VOuCUvgJuW_DV45 z?kZP>$Mvb(d;o?vcw8SrqD-z5HB9A4$`ydEki~ZFq`^EVNsj^7{9A3fJ;^KB(8;@T zX5E>SSK+x4Y|xWeICfA5M7v2s+m3cuyX@pdJBt>ai4B)S5aHX|$KNu}eE&uzjA04+ z4PUaTTWW%H%DkAIC5w6_IOmP@Olt4hyXQox({tFm?SN;mW6!D1drky9;g~rb_t3r4 zID9mtgHH~HO02MPI@kJoa)R~s$!_cGu0$t98}6?7)1gG)+mlotVb3;}>1EI4lCUlyE04rp8rAq%b!_UO0h12Y@i}HppSiCy42f=i03>l!Sp$h)4_J7* z)XCCrP4_M&(cAV!#_08e@aIkwwie|kO?L|<>Zrv;Qv^#dK_|HTAc@qzfpmsre}v>< z=^scmY7?W3pIPdH5{OvxwR4Vj^zz8F=x7lPk^817?l_L6F#}beMd?FT zz|ts4B3I)eC9rNfq@gT%AVsnCUr2wkv;mUfZiOVc_JH44rUHgZ;-}?KMjmGm?Qf3V9ix(5CqiU?%9Gy3ttxHRgiW@gQ z_b8acY*beqw8TL$9audvovSU&=v<#Xh>bU}y*IEKuC(WT0JzQRmRjsUo|Th#`e2Mk zxJx*l*KjI3T7rKXOP=ZZ^|3%5OHHP@&Lx;z#3aE_%Q&z zj*Uu-eHfX-^+r8We>4bw2vXn!4#!dTw^3!F%SXRkJ_lk2Vxhs9u9YtBlr9~cU;?ELWPBijA2oG~r7DM09o~w~_1FpLxk4f&)gm0Dj%}fgJs+w> zeA_|kUe;b|o7PSVj-nB{Zh;z-;L&`)kZh2I1xn`#Ow43RikY^-+47Y)a>|9qZa3YFiVU3MfJie&P7(H5})ayBUZPH7q1bV=3#pH*cae zUqNjSXHYUIR^X_-LZbF07=*H$aVSF|+tdN+HLBXBGV1B;DG0k{lRmmuLm<1W5DAyr z9pHfdKf(#Q8yd>5UhW%J1K7{RPn26og#0h-y5N4*qQTbL2N*TXfgo%MiEKQ`y6*j2 zDE+?0gicupr9)PGr3G52MYc}W0<})T>#9jMNWuc4Xu?hn0!fu1BuZ-|etKOJgMtww z&~&zhUAF0U{sY8 zw#9AILn8=%18ro;!(On2M69i>V|V&P#Mz`lfEp4Z2!@b|@e1p@bic6PoZ4;&?#8E|(ziM}XOb#eK5b8^d! zI%h^X|s#Uu~2kjSqc7~8~>8* zd#w6smiZ9>lddGh&r-b)>;90%Kcd;P`2X(xqw(KBGR{W-BVx-bDk;dIoM5GEZ@0?A zWwNkh%giXwn4O1zOU}#ITq5f!dYQ~9&l4`8{S9X0U-7d`GT`W08pU$jv_`i-GP9^~ zel~nQtKV+f3gJeY+(YA^IW`_i|mWm&%EAnOVk-CR!FTP}$gFf-SEQ|9GC0k(o`U&nj9_stk>Y z8W9yWbQo>*A`Xlyr6haFy_yX)P?~$X%EHh9(3Zqn8?HH9$ohAjFF|&CeGcr zw@LD$5LN%$*^o0|4t9i|xcA&0cg*a2*Quwk{NPyk7hl|Sd$(_*UcWTL@zaFie>_#( zwzwu|((>1B_P_SsUa;ZH{#|~!dHAxi1N#RzyXkzF_gn4%`nz`ze!4B|-POwn-G6h& zAN}TJ-F;i;%IBLrK7Y`plJk3-raoaQse7oyp|*=}e(LjYPq+Iy^WdS6T2wtc=b&xx z#r#d-AMNUt8+r9LTesgFd}4jO&j&u)FEQ!Z`8FTDy70Ln3y&Y|fA2X{><y`lQVt z6FsgxIxZx2Ucc~Jv!iw$8J9QzgUZFWb?^ONbVF)x^UF)yDmGD68JcYN3HXieQ+??2T2@vW0<2Hm%&=d|dmZ5^@}J^4~pvyJUyo|`i5 ztu__=rwCYEe-tFw4(B}8TTlSn;{^PJk zeec`$aBQ14E8egA`_HfX4X^0X^wlqhUw`+pEo=8@gxJUbw&wRaM=q>i@o-`CtAqCb z-0SM|_p}~!>V`vW=5`sjuKD`zKYly0Zd+~Mr`dzso%?3|2RqK)`o+4RzIkHHwCW*U z-f)gjn|A7p&7InR+UB0P-7#N%zwWpBf2|G6KBS~Q`O{sq)|`$`aOZw-+w(IXAA70W z$1_*m8@hjW(9G4j!~UGv>FcejeFhZNtr*qpA6M6kp11XTF!90bYpyOhFgNX`LAMOg zsCjzG{Zl?o-k$!~kg$sKcvviLenglnqW<{L27jG()95Zg{B(jE2(LwY4ky(npS6#QSemFAU}=U zPow&q)>*VVn+U3%C4QQF{4^Wh* zI67z0P>ua%&`^!hOqgz&O3})oq57dOZZu4kS_(}wlv1Zay%*!S>7wqb+`0kB483DFI$v9y zw$F5ry;+jQ7(-fgKh)ET{j8u|XH`lTV+?80l!xx~^kmRa!*$jplEoN9S~N1!(|V*d z{$ZW9N3s}WNUIyO)bsUx#K=85>$qew#*o(4hO{0&clv6bWs;|xF^05kT3S?x8Pk4) zlRUL;be95S3~6;|7LN@emG0{2&{;0YVvHfJ9?YV0QChuC2hw$q*twF$7(-e;nWd&R ze(p=Z>a2Sti!p|@!kEQdNLT&U98RVsSb0qfB6gtHe<}Aeq;=rQx+Xg7q+~J1kXCPI zspsp_CEq6MtPa!_Auz^Ju0GJ}ZR3Xx3peX5hh#CvkQR-MbU(k_Gv=((J(w3r7Gn%) z^);mRb*HQT(pe8k7Gn%)U8AueC`Wb-dqnqod_b}oV@Ru?#-dK*{PAb(I_p!(VvHfJ z{>-A$FNH@pA3d*oj{ZTi7-L9l0I+%;zWU`KWjgDUWHH8&7CoKlb@){BBU^RP(QWBQ zfxs9;S{Sf;rImd3ZC~lEL6XH7Lt4~3>FXuD{mk9RbPurOB#SYIwCJv-m#e5t%MChf zwq!9zxWxln4Pq!%4vbotM*o;}?=_of#7?2ttQ)duq$R@h(lTL;EV@67-j9$Ue=%Z% z&N?JngfX({9cK-T!f&6($Qs7$b{DPrCov@e@m) z)>-2ui!eqOjUaTtx}P1s>k*w*AX$VlvSl!B8ncP+ z5fo~^PrpfL^_48b7+IsC(LKqw?%(t?os}V3gfX(lFpK&D3h#EmxJqX|AX$VlvS=2; zZ0b!Egab|D|It|(3UMHek!6R*Y@(iu!tq&Fht9InfEU4zpOFO+SafYtxcN-iWjf0( zS%fjNVxTdb`Vs{pv3g>%&RQZ_gfX&Wp)s4NrBRr0{Z(FV12=yTgfX(5(CD6jhaA5C zh@Mun5Wymhk>z5RnnRD}_}4mXjARkU$ckfD4{Rxvwb)gzv*t+_VT`PJXmoG;f7RzA z*(PKF;W^17jFIJrM(?B6C+)@1Ph}mDEW#LB3C!w_Ersx?zaP?BCnSq7!crIwC}c3& zNrYCvc191#*`{(ZgC$vnF|x)PSo2^0u3Bf=C5tddR+54B{ujR^pK3`{C5tdd7Mhe- z4o40!zo@g)C5te^QnA!P;bSL-?SxVULd}&sUROC-vstnTV@!QKG8vLu zi!er3s)2Q?W5)eD>yTs-=5k(`C$OCrY9--Fgg;<|JxtC@NN~0zKV(Eewu}Tnwxz!lk(wYuEaZ~)bUfq;dp-6Y*)s%{OqbTBHRY%A|sU6PxA9+F!&`7*ptOkk} zo;9WK*gyb&`U?9OfUqz$Or8V3W-4>=F97LEl?^o1p1sS_AjaE}f7|yq5g=BSLpp8_ z5HBjC;dsH9j+-0gHyrPs`35dT?-Dcw@iz1C*Q~d-%ODM{`?lq zW$aMg=Hy2%I^1D*rNWtSOcK&<5EO5B#wRAlrNpG@PK4E5I(c-U8H{v0;$p_9B)~av z{47lylWHIDPK-~AOGrho@VSexqg?Uj%-Er#iD*1HyG>4xi5oxOtwx&`C=g=fF7*m?VZC^jXf>p*QlNNh8K4+EbEa9jURXVD;Oav0<@s_%uiE z=(80+jmCGn(WX)o=S4g$W5!U!!pb6!ba*}_?wMMZP-$YOaxfn6pxOzwxs zz5GfmVz3c5LPm>3BO)^8ag>Cq`iAxjd^AT!+q{D2qj`jv65`;9h+)Hq*=$3iqenz? zRC_UhV+P+~SS5Uv(+`M^ZdOC!2UsUs1?!F@+%f0;T&M>~$G{ z|2v_ILzs>q<9vLX(xd!JnhN#`4f$GK2i#*4YX+WiKKAGx=w4txkvM9m4cV&$=FDa6 zg@fM$lg|7~9sBn}NC07ZUc`!6t0 z`QifDI{?f_zPJGP&Pj|~}<42*P@=~`F0gPMX{;mB@1m=dz*rW0;24+{xW}?J3RDaZ-izS8)V$;z1 zCS8?&-mK&@d-@jecRWbV)yg4+8?;jd~u=vIJ*BdrPo$o!5#qD z9r0}%folickVfFB-Mbory8^h3M&NMER~9t_NA-7KBXC`Sd$JL@PQdML1diI((MI5? z{=RDjj)rO%8i{L4FBrW-pz}-h(!LQmN;j;LxFL|*XIbCs%$w_HR2{9vk%$t{&H84MK zc8^A>lP67yotWl>9iQY(aU{DY^`I~Km0$3C8NUVp$3C<3@M7$L!(X<2vb*}3uo}2? zfj1aCYEk-9thK-yQd2l$aE8ItBRzhx48Jg%+}TTpdkIYse~FqL;U&W}hNicB$!;$h zZY4AfTuo?lx|f{mB^P_i<(dpnA1aj`en=~>Rl2xN7dPnQW?kH(i#v3&Mi&q0;vrr9 zR2S=X@q{j()x`_CsOVy_E{5u2XI-@EVz@3w=wh@k+NHRYnku}Xxb>)1U7V(i>AIM! zi^aNFu8GSk$fjDk%T^eURvC`g8ICp>jy4;Pwiu3f7>;TTM+Xc?hYUxb8jk7=M<)zN zXAMUe3`g{kp_h-{^lGIIHN7HgZB4LGjB@fI8(!f_3b>u`Js$7gX&@>zG~Nz=S%r7dfl zCcxOB4+SQo+F=5W4kO?Wg|7UW`)E`jg&%x_U`vmy7WRXZ#S*6D*!iu6J&EM7ZYs7n zu#}1IES8F}&0}d1wl}i09NW1p-GgmDOAli^hoz^n&1GpjwgoKh!( zY;R@hJ8W-biOygJOMhXzge97_n#WQbNb_0h3TXjLeIS*yGz8K@mPSLmnI-b7NcpxX z^j|THS-JtzXqNIIjbVxY-+^kxqTB|_&eENb94xJc6vNU6NU0LjxVJR0< zDNFMqm9gZm$`6B|&$6)2zO3+bYhJbP#lU*Xt>?>u=4=c78go^;Yxmpk(U zd@}X)^T|XGfAit{2p&q(g@+Qi=OB5iNo6mO)Tf|(MG}sk?A3!(N%Fi2cSzxphdCkk z{N(n0s=D@=ca>ivs*l6Sn$u=CxdVZD-(-g)p&?vKYCqHlEqsMN+3e*VORjb6SHsDyj12UxOp3BtQplY!DBtfZ(3bKn-!$BR)1saAexnQy= zc1WVQvml9TSprGmsQ3c+Uk$e&lBgE@WCxFnHj8l){U4RLBcf&0jdS7PhjnQiv^;Y5 zOkQW*aOPZ&eNxq9VRVg=b7wd2cZE?O%Ovt6mweXCi5w|f&F+EDW5)+gB`Ar##*i~; z&=QvXRAGU&>e2K9z!mvpQgyE;J+V}z4Oxb>Mu&Cx@XCMctxMY@V@v+BV_S0TlD|^0 zUoanje$vx{!#*oR>~m*}eSW6c7gG<9c&vNR`*P~talDxN=UP`qF7K97uU_j~LEUn# zYb9NuwXRjv!PmOhP_JFI}78sP+&cu zcn%5-Iri((7?^4C;3T@%;Bk+w(Z%N23A>cz@F47E10x@7^1`m)mr%JsD53IAOG0IB zlO=zVe`D)iZ?K{Cd!NpBt?Mk^R^ZU? zd<#n6_4g69I6lXYEoQz1BHt3FqhrbZ$?We-{^?k3iu8Qz~M(Y#JIw>Uz8xH zDrg08ImqS!zsr}d*lHf_s1Dzk?5E4fF>~fVI(yTkS8nU}LynzD7_LD%)txluO}#`a zq1?2we>F-)pFaiK`#pH_H+=;q_A|jUUXLlt%4y~poR>*gu$io zXk3rvVl-V6y+or8l?fvPiu}LHCvFEBJozeGXGaL-II<|cAXVdM;k)ZyEYZdGAC~CO zMMl{|1n(i@8N&;pOjx0(sq=78mt4Z%c5_gR;I90-O3MBM7V9e4aYWqTWJ0y`V z{b#L^XnYXOjF&XsUQPF|ruzxf-HfAiF1S`m*~o=O=?)1^8dA6x8wDwsV`)?%I`{FA zRx>UK68&GQMWL~Pu=f-bIG=O72f)v8K&ox|YT%Nr-wgV(#FHDn$ zLZWkGQQ{%>WN9L#FqW=^Bp4--1a1)|nxde)?u;;aA%~AdTKj>%s7C8Y3>*}~N%_(+ z`Z61i!#o!we|J}}42uCV@^B7rC3Z-T9si)G;C2#u*uJ7H%w+E zVk_F`Cy*BK`T7FV3Xc5|ThS8WWEa(nXrF3@#=4!nNh8w{D0qL-z0-v#`f+Di7Z;?;v!Pcmse3P-|csqD_tX;)9e(l1F=o1*i!uGvR}6x0OeMDGSEW7GGc zHe~5zA&JsYfF!P~bWNhWtk6|J5^d^UNTQ_Fl0+kFsI(62_D@mNFv{96>-N2o=oWDt zj%EZaTG25+>z{*76qh`*CITySS3?!hANqgv9wo} z*sW`7J+*#yg4-!I1U!dQ-H5e7M9ZKj6HzxeLlX5+rAg~F=}AbUZuUTubyImJ934LW za|b!D#;p)hXcDcc=Qe7@?L)&@x2tzHa(CTO_M@&YULS?_|k%54(ePPh%^rybMX`=!r(?-qdvOX}Tkt?n_NaRWG_ zL*~nF8jD3t!BP=R&TOG(YUrysKtnys%CHS!H)2qa-gQ^lA+Y429;?ELLH)NF-s^+< z-SZS4(UV7bF`~ELz6>eIQT;8ra_#9j#@?AB_U_qYpOh)~sdQctpO!85({jXq#vHLv z&lUTuJh9K^fxR;TMVIcvrY`~0t)Z>VrXe=br6S*OYwx;(^RC7W{tzAgrusR4w7G(k?G1elV z7(&_#X$Z%D4@vLMu^g0e$G;hU$tygYfCU$Jz>4fysz+}|u4K$X#}0bT;C@71pkv2m zn8o1yBN*7x3dSMFb%U%3`6<%VV-57fNPmTphmagCnX$Bcyw}YMm2)4&iJWa)^8Kbyv03t4i;u5{$YJ+xxH3A(}ZP2%n9GH}<4GIQ2 z1`}GfK^91{n2M?mI)PXxCe3Pt-i74CG*)fU8A$P%G^-8z1X2Q~L~4W1LQ2F`Wo^)T zNJ)6BR~yt4R+7=V)dqbAT`DG}YJ(0ynt-XT+Mq*_(lCux8$=76U5^f~Hs}I$eUx-a ze^ab!2BaED127?28$>RA2I3^w27L+LOt?C(4N8Mmk)$g(*POb&wJf8*8#dii6}Z#XuSZ$!T&yih&eoN`W*CQoP9x zX(XfsQ?d!?Dh1+>adfV#g4)7(WQ{giZQUJ`v+S)~Ejd+|@%1(C%6&~nD`<|3zZXk9 zRMP4Wt+Wfm21#5(bjuMJ2@T?fE(X#fqylH!TI}_jL|vC)lxWhennX7X5lgcbQ?CXo{+5lh#U zkYY6{S(E6>60sSYM2|E=H&2sj%30{DH0d5qdPtKtY0?Xt^r|Mkp-Bfd>8K`sqe(w% z(jS^+!f6&c2+<@sjg`8qHL0JJEXrU_H%gOSnlxUMuG6GUO)Ai&1)4<8okR{innaV- zq_Zd+HHmKJ!E`Iv=Y;VLax}qnftGbTS^4L!WeH3EB246mPXtl^lsl_akSBBT= zxsnx2^X_#BywVOTaWT{LN_YG$JiF4GFYtjlrkjU_FB9s1 zE&T3n8SC8G3T_%Cn&PwYdrHBer<6{tTL@`6eipjgC4-J>NMup&(scAhB5?O>xg z#kkFy?pX~-Z(BqTUWH_1++IyrtKsz9&&Sa9WZW?gcU;3!-3oj3ywaO-ziYa`G+YzJ z2wZbWeHj<3>Bv8zCZ&((Eyam#c1p^3`O9MB-pporRj-7=q zy-&3$IoQ%L(!w(|#J4Dw*p6XoEw&_?i8Zc_qR zr|Eux6px=pIfJc8@Ga3nV%_Si208NMn~4djQgGjy(iPaF1xQCcNBgV{$7^=;Z+d{hy2) z=$a62xrG#r{Hw_^J?LFv3dQ3=f&j|B=+5U*Ro099JCX;K&@VP!C+JCOr51WNBIMCvZ!i9vx1 ztLI5bR1RU6Y|{Vls3DNuEr^8Mb_*7@i4iz@AX39x2%_XdqLOc8ov8)Z?}R_R789Em z6FQAHGSCoLu!KacU99U4=bAxLbgVPzNZ=^vLJEZ>7-V-VergD0doLoXZcyC+C);GV zRyB-$AlnDnwh2y+3Zh!TAgQVWU7MSZ90V1E$2FkYiM*tesW zsg$c2fsOJBZDgQ%Lt#ruWa}f=b-B`vN3m-Z;VfTK$d0k)(z#c|eGr5lA(5TWSl1=2 znbJ1vZd2Q+yG(6OcbbF?eb|Gs_CVPtwWkOYJ5(j$W!0@*%?Nc|dAb7D+iPeIrvoAf_mY6xWa z0^8*)3JZj^7$UAH`cE`9(0yLijgY7;|FF)~K3Hj=gh_(lvtRVLrzZc|EtM} zz(1JA<>kYny{lYt6=uxN&rT^SjLpx>E-Z5v=S|AY$cJAP#mi7}9vdnIm;N0b|1PP( z)eEq24kOGej;tH!m6nNviExYJDn}d;1e~<6v@E+InaY=0D%Dweg>ZNh&1LfXhu!E{ z{y$u$oTCTNiei9z6zO#|V%FeU5njiGXNd|@v4c5I{KGl&5bM1nf~K8R24^oy)`EhJ z;ylJX7ZfC*j0MF-rC2BGxDcL1?ISa8Zg-LR#gW0Vl%y~`4 z=Xf^Eb7kWbx?*f;E(BRIt_o3-JqKQPvP*2a+4;rTE#O9A%goOxE!FJU@R?mUKAkF6 zGVs)y4XX?A(Ox0er7z;oS_r~mp*a$*Jekr`#afu|H&`z*mU~KeQodC8~mK*(63c`#<@+A6<2Hwg>8p>>Sw z@2BnwtGUblq~n(0YtNh-_}s}D^WLL}I%N)fX41Q+$a$-u9e3kxxBu4awY+b8x(X+s zYGZw&)eWxUH{5e^`MP6+f4S8&^0yA(-El7QmLE?o2nwtE&w#6TU%#=ev$N=)MHe5x z^k97aEjQIY{ZsXdH4Ewcb`Q*iFpBe#rj%?L~S@S`s`z5Bz` zmOogcUv2mOn@?8O^xuE{Vq8|n($J#i11nbUn|D|0T2EQ!6vyMKH~n|)(f%E$z7siM z(6via=e?QuV2{z;dKQ`72Z#PR;Y7vaDyE<~OPO!u`xv7n-V#1Wq zzB>BlC&i=74^L@&?DMkSTkmpy*v@pO*^O6^Y@ZSLe60PSuMQSw*Zug@-1>X2yKTqv zf7Ty;?w8R|jx0!f_|ElroZhtf-n{H%zqi=6sQu*fhn@|&`Hyqe`$jCj<@>U z@!4zcNnJYW=XYOy+i@apbV=Etk1gzV|D@ahdTD*%2UkCFxTmt>;aS6z7iXreJ%9C) ziJy#FH+{z2!+-hZtxoM1PM)ORUH&guU)ZlEs_ni1Pu>hI{NLe*91m&llLc=-%L5!i1Az@Ol>yCL`UkpuenN2jhrZ*^GT*^)N$24OM zjh~uBie7pMv$no=CD$AXVZuLF~l~TXnaVRbuAYJutQ@Vvx(B8H$wMYkKiHP zH?0uH(3p#)cM9*@?T?|ck=aCJ4?CoDKfi_tcV9cL7(*irs;O-=-2u{S%@`W_Ooudj z%T0TQ9USme3+*WYfY6P%Vk0!_6AtNwCeaTw%TF`kPebD^H3&N!)I;orX0M;-J3q~z zej1w5QG>7(?x&#{1vLoFL_bZYpQhALv%*hvzn_NQ*Qr6I^}f`Y6`L$+ozyhdG(SsC z3r%AdWSm=-Me__4ESe@kYMN^rnjN4JtZ8TkaSF{e%@a}+qG@(ZjiPBj@zeb1rwO79 zor9XgZho3!ewt)IO_rZ#v7cs*pXNnB%?Ey(pZqi-)bSYd+|N%F>!+FSrz!K(=uh}+ zZLIgh?Do@q?58>FrwOLZ+mPoTewvYfnlwL6zMn?SWs_+&&rkVb@RCyo74wasrWtj^ z98^pXKh0=A&2@g7MShx9ewxSqG<*CspZRHi@zVrTCvM2I%}+DZPcz9+bEBW8%1`r% zpXOyh&0#;y&wiR!+FPr@7xx!z>h8GB}G)=hF=w%;a(D<(zgH=+73M&|oK;Sh< zhDJ&iT~w?YJX~rhTdWx&6+AXEYN&%_O_YkElVsFTQ!{GlVqndXA(BQ}H?DwUg+})&C!|gyV&K=0s8s} zOC^gjhP2um()wo7oCKZqfMhYokXAcph0_+l;fFszt+QT`EXEkpqP*$lNnq}3T(yJ~G-3rg`Y@p8SMGsyGj4`Cu3tF>@&Lfp;(;dG@=xdpz zN)}@bY4v87S}tnyI;%jk7-LAQ53{J>ptNqf>$)}ixt46vr}h1 zC0U{`8tCOcs4u6bUduO~?DIrxtq$LoEXEkpx`tV5TB}y4KBKehB#SYIa`j`DdVPKV zm944H`c1MJV@RvNA+6X|x80_*TGDL+fiZ@(20$zP#Z&8Dyr@|Roz+va7-L9lAhXnR z-F`6VVVyNnvKV7XYmml*p!9n0x?cLaL=z;7F^04vG#2G>Lf-77IxA1I7-L9_p6vB& zd3kK6*NQb2lEoN9T6FK#`wi#w*?;RR*4!sqj1dmSfmVajpFWKsbT9m_Gex6SoT9uS z?J!31Ue_~uA(#(`K5l3{^D9Iv>kws0xY@+)HR!Ct$QSkFhxP3Tk3=Mqf{;t~So4vtlKSFh-Wsz)E@f@IIZD zEm?#yvS1o%(ddqXHS`_a+_cs!S%fjN;-E2`8x{-MHnM10UEQZIZ+V)^XsS|byhdoWC&wqB|@WL zmDemgitb9SjS-SX7$a*Ov(y~^)4KIkoi#_Y2xDX=F-xtDp|$-s>#YAs7GaF6WM-+? z*R2;Vuj;H9B#SUcRtmFZGgVgodgOPVbxg7dV`PnIRtsz?3~hP{Cr7Ofet3eGFh*7? zH2P}0@o%hR1U3lW=(dkQ7$a)}GQQArtVT`F?XJFZmeRDu(jgTzD7+KdFSmz$ixS+GrC5td%d3ghy&a6+> z#)u;kmV+TyF~Mtfyp+dB4O#rUKRKgxu8hIE{G^Q1GP#%vFL?r0GJluh=Fc)*~nFd#;aaqI`ERoaLt!mF4B+W%7pw zY7&zR)%W}U7&W=<9K3DEhadD&h(9luJ_JzJYJ#lPOD8_b5LR@pGaE1KixvvCOl(qa z(E@`at!Q##US?4ixgMw0e6Z%ul)RF%c^UcRvKOk!N=pg&UOB zBxBUWw4!7cBSxV(g|yBNQjZ*>u7#85eWGd3A7jyxrUeDXpAq3=Z{$E(-mX?nbXvR!xCR6vwa7bJ4Q^Cx=t+4u z2ekfg`lP&qyt06aI7*9gt|!v9V9Z)v32JHfyqp|d*2WaIoG_%JNVK9dd<8|HKzV1E z>Hy#1h=O~iI1$$XzU}eTCu4z!0+GJ)H0T$ImlZb}m7j@;*;s2r{h-QGM!CZ0KVGc3 zqRe?zIX(%fr$;soFM_}_Et|esQk$mGiz4O)h?$aCnukxs{1|E>{cX96=4Y1}EP0(5 z?iOi^TePKKK9kx!>ox^JGsx=bg{{PC0Yt%$YL#_K{GxS8*61R;d-Mc3s~>NcG) zqq=q}?#p6BOyD^kwNo_}jfezka+!{u^D2uc7gyF8#JFfyVvDWTj=BFC^EB@&#>AA0 ze|tYay-AQAmB)=a^zJe4ZkI)#tt#DzmC zr{*HsT-j52TesG?xU7Vl#`=~rBv3b&Nf7&Sv9zP0=}j@QC6|SVQH6>EFEB>FK`QN% zW{|Tb@DmIh>j^8IKUUw7PqJ>78zZA-ucX6L5b0%9Q}0@}g(x>Bjp;fLlgC}`vUeOV zPrp4bw>yUCi7mVKxaLfV)?7AcLR6;F=y4j@Myto8TAHZk$y%+ ztERqD+0tJakZ)|E6(Lm1RfJeALJ?xlPQn5p#wtTtHi<Zo}ux_vCo7D_9Y>+hR9vWb6(aa#t1zEv7Uw)QHoez>C8!GhV zd9w<0eSrdvkt{PZyq@epwl|oa{=l3JRYE+VB zMn<+LGnj!rCJ~}GGsQSxMN3wZC(Gx{%nkT_I+0Cb(HKGOMd>Td%`3|Fl(JbZ5kcj6 zu-9NPHv>CHV!n#iR2R+E_@d1Gf{dJeKQYY8sAeB?-AvSX7Wv==1tL=?SAYMGArV(5=+Di`%|nT|tY&##FCtc(o~mnN zbIr`$oQ&Lp>?oS*ewFB0#CyE1nCr>R%E>Cg-TLn-j`imT3Ui8l$O>Op9X$^i@JP*A zd1u6AY-5-_4nORUn2fzGlT+}+&WOp_B{5ms88K;0T4K_e@%W9yZ!CVP_@&^Nj34?R z`96zDu#f}`NwAOv3rWdI_$7j}5Wh0o8F5@CBVp8CVL)_@tY5Yvl+j25xl=_2bgULe5K-GUr~J%=K5AHT3%i?cX4%P z+1#>OlOv|j4wE~;3#d~RJyZFvn&l1HV?T|nOl<}RxnxhyFqdE|<* zDI?Ld6e=&7TUT4c*rQ6zYv)cbt0*h3E1L`3$z$fBTeGaV^grJN28*ROd>tPM9|$z; zjOA+yvDH{woOH|4ibZpp>2v-`_+haNmCc!rJ{PUq-OGCAA!u?d%pf;K_f2nR>SP?V z7@})Dm?3VyAq~s)9SC*MV}$jp-CdpTuD&?@;<=^n&>$OXq=Z)caE^;d4$C_?Iysj< zWYgFfmjYk00237!3~7Lj!VyCHL`t9QBZ+;jh`pH5(YB4!b_`!JfNDY24FTZu!a0h? zIem}DdJqN;s^?TU6o6}RL>ehfX4IhEQr$2BuE7y$Okgsj2GzN$8xFuVI3f)Xld(s; zadvufMMX6}K9n4sfAjZEr|fy*=EbEe?%g@<^|z1!=KkAeOVYKX z+i1j_1^qZO&z7VzL$zt}Ge0gOv5g$6nw<{1g5=ZGa^1IP4wYo5gGv%{R&?q1Pcw%K zw$njRH{$%f@)mr#j|_{-0v}OFK3kW4bfKBko^g(ChkUKMcovxP)a;*l=Q(-_O`@|7il_Qx$ISKvhrN~`ctF>hFSHm(8XZf|E~i7iOYZvgpJ%8g9xYIzMI3n?3_Ts4 zj?FmA?n!9yff>}LUXFD?R+ag%VLW}Pnu68|K4S_0Oneuwwe|{@6)%gT9oZnuV)0SYBu5}78GS z`jWqu0TBSt2P+E_Aw7Mb&oeI({etI0MHh@6HcJ@T}gQsotx{{dTUnOG(A* zotWB@7lO0-I6SKJ?g3}J;L$&3&*B}C_SrDHXz!e_gZH7}YVUN0@pNRvgWu5zdw9pwuP9h86l;vqI{oy-r6(cY zMmBaPCGkR{t5U0qN`OmRPmav0jz2r7g~bt-KN{TW)Y|QfZ`$!~w@HsK8kmq;{o1N; zZ+N%;l&=qt{_LlPg%9_b^w@K2)KzJY%x~B=yma_Os^$N-b~UAp?xv5wUyb)tLdG^T zk0-#_5# zb<5-J_pWXe`Cq*j|7~?Ll|3p)cO*KlH`lkkPChn=*U4rMrPy32pGacico7}0p5i~3 z(9AG$dM!Pj3k>h+RYJn+ZDYSOuaoH>kX;z3yjG-l6F#^KHJv(PfIj+rOVQ_x_4c?h zs12xC>6NQK^7&5&i=j>Y?|n~7N=Y2A*JSNkP1X*jlKN!HS+$8*N7PW!+QhUfv(Z`A zWb~w=^@?v7wTf2r&=QjgmFmU7(@{|#6dcv2RgFhC6s>D)bkTTfyIJK%{Pm`ihEqORBN*XL-re|F{YjEAq3p zGw+dSUlE#@UznSe&RqS+_Ib>C>koD%ST7~Exr{jnSr&quETwthv%Y=k? zt{Nws@kS}-gznTkZjBHTM{dgU4r;pXWJir?*6O52Xs#%wbpIK-M+T zq%;gb*5!QA9)>@c)fAUzPs{N$FVXLjh_PV>8Qy@;<55N@CyG`juaS?}pD`vibu6#E zsTF!5tGm08QIzjQ9$D4hBh)6Unj2ACp^XtdtGb&CUB2U~h zcQ|tNh8xXZBGmx~XT_s}I@Shn3V3PYT_U)oXJzjx$nODXp?JxrqGiRS+oZ|(A|8cD zg|!8|mj#zDo0YwZkRJf2$H@S2ROqdE6z`#eLp*ZPcq44`M%&;~|JfKDJZje#fOn?g zMoTZHW04Je#9Ly6_X3EO;EkhCzHkfiv&t8`{K@@^p*t(y5_sp?;8FQ_%m$D0?-`rC zw{7tJu=g`~69xdlQ9fCvV=?42!D$jadQ4dHDBFGjCoTa1?pW9DWWnJ~YkL%*zBYJN zZ^YZ+k-b4ScxQn(6ub)sm-MXCI~elY!Ff^eTv2$We^_t;nX|G-ykBha`hj-@yxs%3 ztv2`<&E9Ci;Y@4ZL3oY<@8m(8MfH-EJ(ABC9L|i+TV#Vr>8-NCYXR?U@WxYy!?nfF zDt=@yBsjz)XT_uYZMh8|y%(+l?_R-;R-W5|_m~ZPl+RCrciRvEIMTCleWRWX>ub#5-z}7c)#469261mBOzRcr}9S!a3tbd_SRYr`JZ2yV3a(f92voA#!Ix4?$IH8$;C4&IG6>^))A z-V5Npc^rGONbg~r_Wl4bmWJQJMaw_3H%M?85r=5kV-$E3Y}lJ=)82gWDvo2X6XJ8R zO?y{^x8*qYD7{TK?d=BdbsP46uxalIcx^}WT#j}ks zllM29yen<;uC~d$)+XN)KAXG;Z1T3+ z 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 literal 0 HcmV?d00001 diff --git a/vendor/lib-vc2022/glfw3_mt.lib b/vendor/lib-vc2022/glfw3_mt.lib new file mode 100644 index 0000000000000000000000000000000000000000..eee805592a625e632d9ecb7b3dcaf12edfb46e21 GIT binary patch literal 706026 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

5;X_YD6CRD`UDC*{o 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

    y|TW^Sad;?94 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 literal 0 HcmV?d00001 diff --git a/vendor/lib-vc2022/glfw3dll.lib b/vendor/lib-vc2022/glfw3dll.lib new file mode 100644 index 0000000000000000000000000000000000000000..40d5189d9f9cc0a19c85208f1c7b8474cf5613fc GIT binary patch literal 31378 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 literal 0 HcmV?d00001